Compare commits
	
		
			173 Commits
		
	
	
		
			2.2.0
			...
			tx_end_tim
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 25170d0d83 | |||
| ba6446378a | |||
| ec9eb17ee3 | |||
| 7775f5978b | |||
| 8c031e7649 | |||
| 6b2eae7f26 | |||
| 69805a423f | |||
| f1178157c8 | |||
| 1ebc6eb03a | |||
| 916215c0c2 | |||
| 6c8e149be2 | |||
| bd08b69747 | |||
| 33e0061147 | |||
| 45e1031e5e | |||
| 73b21cb80b | |||
| 15fb825548 | |||
| 0d448368cc | |||
| abacae42d7 | |||
| 9d2e2e7f64 | |||
| eb64cc60c5 | |||
| 5ea0d6446a | |||
| d970d07048 | |||
| 90f45c698f | |||
| af388b2462 | |||
| 8700e2fdde | |||
| 23ad84ef30 | |||
| 0d074ea6ae | |||
| 351a246238 | |||
| 841b5fe2b2 | |||
| 85ce07f11f | |||
| b44f3418f4 | |||
| bfbc40c282 | |||
| 2c66bf3edd | |||
| a51f922ea4 | |||
| 4d8e7a3cd1 | |||
| 70ccf35fe4 | |||
| 6c5032da10 | |||
| b2e269b67c | |||
| cd01c6a808 | |||
| 179d40ac8d | |||
| 754a61e989 | |||
| bedf4c5c4d | |||
| 7c27bcec47 | |||
| 90f09cc222 | |||
| 21d83f93dc | |||
| db838efc65 | |||
| 929af41dd3 | |||
| 979a7672e6 | |||
| 67818ff4dd | |||
| 0c7631e912 | |||
| a06b888365 | |||
| ded10e1c22 | |||
| 2f3bc0d892 | |||
| 184f1b2d2c | |||
| 90249dadb9 | |||
| c88eb32db8 | |||
| d47db29b93 | |||
| e8148af10f | |||
| b298a4ca6c | |||
| f474e38687 | |||
| 2e806f7b86 | |||
| b7a8d99e2d | |||
| 2a09fc7e6f | |||
| e36abb8d55 | |||
| 5746b9f758 | |||
| 6be1f018b1 | |||
| 38a046aaef | |||
| fdbd6f8402 | |||
| 1dad204494 | |||
| 54661c51ce | |||
| b34fe0d0ba | |||
| 868eceddc5 | |||
| b642c396c7 | |||
| f3d8e34ed0 | |||
| 401c760e01 | |||
| 5add0e385d | |||
| 2ba6822f2b | |||
| 54124d13bf | |||
| 5b949a9d37 | |||
| 9a9b25622c | |||
| dd6a8669b1 | |||
| b483897769 | |||
| bd24c4dd05 | |||
| 664e99d09e | |||
| 675b2ed972 | |||
| e6f19311b1 | |||
| 4a8034191c | |||
| 9d4e5bf636 | |||
| cc9be70708 | |||
| 2dcc72f679 | |||
| 563b6e2b01 | |||
| 6161c0e0ec | |||
| 61c2102ab7 | |||
| 796a04b981 | |||
| 2a71ab94f5 | |||
| 923b89c038 | |||
| 3de6c9900c | |||
| ef1f2a758a | |||
| 3e6d5bd33e | |||
| 26968b8521 | |||
| 611cfc7b46 | |||
| 8cb77a555b | |||
| b4a7f032f5 | |||
| 62e0ec2008 | |||
| f6cc12e8c3 | |||
| b38b268fcb | |||
| 55a14edc9d | |||
| 45c23564b5 | |||
| b170fb3c2a | |||
| ab975eadd1 | |||
| 7ad70411f3 | |||
| 24720340be | |||
| ad51066f1c | |||
| 95e2db60b6 | |||
| db1d377da6 | |||
| 230e8dcc7a | |||
| ab2146102f | |||
| b1148922d8 | |||
| e4de765da9 | |||
| 47120c66b7 | |||
| 35ccc71f10 | |||
| 688a6abd99 | |||
| 97693cd0c4 | |||
| 3e5ab7b0ac | |||
| ad80671dd2 | |||
| 4ab3000b69 | |||
| 572e999a5b | |||
| e5bcb25d24 | |||
| 19ea1f0b6d | |||
| e88014ebba | |||
| 10a0608fd3 | |||
| 60abfb7afd | |||
| 6b9e3c0e70 | |||
| 19065cdbb7 | |||
| a7afeb1f7c | |||
| 150c404cdb | |||
| 5fe8b261ec | |||
| f8a177c9e0 | |||
| 077a6f8011 | |||
| 8b84f1341b | |||
| 20824e75c1 | |||
| fb283ab668 | |||
| dc3df60716 | |||
| 47b58ed770 | |||
| 1cebc2da0a | |||
| 414030cbd2 | |||
| 8011585113 | |||
| 270a004037 | |||
| 2aa4160400 | |||
| c8e416966b | |||
| 20cb208719 | |||
| e30aff82ee | |||
| ad2937c332 | |||
| 0e8a757d6e | |||
| 220eaea73c | |||
| 24d6085ded | |||
| 8a66734279 | |||
| f6e2224651 | |||
| 5d85c12bb8 | |||
| 2b1cb7856f | |||
| f1d080983a | |||
| 767b083a22 | |||
| 348ffe20d6 | |||
| f3494e7562 | |||
| 9b6908f193 | |||
| 0cfcc8c118 | |||
| ec5cd209c6 | |||
| 5933bcd512 | |||
| 14ac6654b9 | |||
| cea11743eb | |||
| 210d925987 | |||
| ffbffd88f1 | |||
| ec8d54dca3 | 
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -6,5 +6,6 @@ | ||||
| SCViewer initiator_target.launch | ||||
| SCViewer.xcf | ||||
| SCViewer_1.png | ||||
| *.launch | ||||
| copyrightLog.txt | ||||
| /workspace | ||||
| ?*.launch | ||||
							
								
								
									
										17
									
								
								.launch/Build SCViewer.launch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								.launch/Build SCViewer.launch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType"> | ||||
|     <booleanAttribute key="M2_DEBUG_OUTPUT" value="false"/> | ||||
|     <stringAttribute key="M2_GOALS" value="package"/> | ||||
|     <booleanAttribute key="M2_NON_RECURSIVE" value="false"/> | ||||
|     <booleanAttribute key="M2_OFFLINE" value="false"/> | ||||
|     <stringAttribute key="M2_PROFILES" value=""/> | ||||
|     <listAttribute key="M2_PROPERTIES"/> | ||||
|     <stringAttribute key="M2_RUNTIME" value="EMBEDDED"/> | ||||
|     <booleanAttribute key="M2_SKIP_TESTS" value="false"/> | ||||
|     <intAttribute key="M2_THREADS" value="1"/> | ||||
|     <booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/> | ||||
|     <stringAttribute key="M2_USER_SETTINGS" value=""/> | ||||
|     <booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="false"/> | ||||
|     <booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/> | ||||
|     <stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.minres.scviewer.parent}"/> | ||||
| </launchConfiguration> | ||||
							
								
								
									
										18
									
								
								.launch/Build and deploy SCViewer.launch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								.launch/Build and deploy SCViewer.launch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType"> | ||||
|     <booleanAttribute key="M2_DEBUG_OUTPUT" value="false"/> | ||||
|     <stringAttribute key="M2_GOALS" value="package"/> | ||||
|     <booleanAttribute key="M2_NON_RECURSIVE" value="false"/> | ||||
|     <booleanAttribute key="M2_OFFLINE" value="false"/> | ||||
|     <stringAttribute key="M2_PROFILES" value="release-composite"/> | ||||
|     <listAttribute key="M2_PROPERTIES"/> | ||||
|     <stringAttribute key="M2_RUNTIME" value="EMBEDDED"/> | ||||
|     <booleanAttribute key="M2_SKIP_TESTS" value="false"/> | ||||
|     <intAttribute key="M2_THREADS" value="1"/> | ||||
|     <booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/> | ||||
|     <stringAttribute key="M2_USER_SETTINGS" value=""/> | ||||
|     <booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="true"/> | ||||
|     <booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/> | ||||
|     <stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/AdoptOpenJDK 8 [1.8.0_232]"/> | ||||
|     <stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.minres.scviewer.parent}"/> | ||||
| </launchConfiguration> | ||||
							
								
								
									
										20
									
								
								.launch/Set SCViewer version.launch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								.launch/Set SCViewer version.launch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType"> | ||||
|     <booleanAttribute key="M2_DEBUG_OUTPUT" value="false"/> | ||||
|     <stringAttribute key="M2_GOALS" value="tycho-versions:set-version tycho-versions:update-pom"/> | ||||
|     <booleanAttribute key="M2_NON_RECURSIVE" value="false"/> | ||||
|     <booleanAttribute key="M2_OFFLINE" value="false"/> | ||||
|     <stringAttribute key="M2_PROFILES" value=""/> | ||||
|     <listAttribute key="M2_PROPERTIES"> | ||||
|         <listEntry value="newVersion=${string_prompt:new version number}"/> | ||||
|     </listAttribute> | ||||
|     <stringAttribute key="M2_RUNTIME" value="EMBEDDED"/> | ||||
|     <booleanAttribute key="M2_SKIP_TESTS" value="false"/> | ||||
|     <intAttribute key="M2_THREADS" value="1"/> | ||||
|     <booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/> | ||||
|     <stringAttribute key="M2_USER_SETTINGS" value=""/> | ||||
|     <booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="false"/> | ||||
|     <stringAttribute key="bad_container_name" value="/com.minres.scviewer.parent/.launch"/> | ||||
|     <booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/> | ||||
|     <stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.minres.scviewer.parent}"/> | ||||
| </launchConfiguration> | ||||
| @@ -1,52 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.sqlite; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| import com.minres.scviewer.database.ITx; | ||||
| import com.minres.scviewer.database.ITxEvent; | ||||
| import com.minres.scviewer.database.ITxGenerator; | ||||
| import com.minres.scviewer.database.ITxStream; | ||||
| import com.minres.scviewer.database.sqlite.tables.ScvGenerator; | ||||
|  | ||||
| public class TxGenerator implements ITxGenerator { | ||||
|  | ||||
| 	private ITxStream<ITxEvent>  stream; | ||||
| 	 | ||||
| 	private ScvGenerator scvGenerator; | ||||
|  | ||||
| 	public TxGenerator(ITxStream<ITxEvent>  stream, ScvGenerator scvGenerator) { | ||||
| 		this.stream=stream; | ||||
| 		this.scvGenerator=scvGenerator; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getId() { | ||||
| 		return (long) scvGenerator.getId(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public ITxStream<ITxEvent> getStream() { | ||||
| 		return stream; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getName() { | ||||
| 		return scvGenerator.getName(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public List<ITx> getTransactions() { | ||||
| 		return null; | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -1,199 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.sqlite; | ||||
|  | ||||
| import java.beans.IntrospectionException; | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.sql.SQLException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Map.Entry; | ||||
| import java.util.NavigableMap; | ||||
| import java.util.TreeMap; | ||||
| import java.util.Vector; | ||||
|  | ||||
| import com.minres.scviewer.database.HierNode; | ||||
| import com.minres.scviewer.database.ITx; | ||||
| import com.minres.scviewer.database.ITxEvent; | ||||
| import com.minres.scviewer.database.ITxGenerator; | ||||
| import com.minres.scviewer.database.ITxStream; | ||||
| import com.minres.scviewer.database.IWaveform; | ||||
| import com.minres.scviewer.database.IWaveformDb; | ||||
| import com.minres.scviewer.database.RelationType; | ||||
| import com.minres.scviewer.database.sqlite.db.IDatabase; | ||||
| import com.minres.scviewer.database.sqlite.db.SQLiteDatabaseSelectHandler; | ||||
| import com.minres.scviewer.database.sqlite.tables.ScvGenerator; | ||||
| import com.minres.scviewer.database.sqlite.tables.ScvStream; | ||||
| import com.minres.scviewer.database.sqlite.tables.ScvTx; | ||||
|  | ||||
| public class TxStream extends HierNode implements ITxStream<ITxEvent> { | ||||
|  | ||||
| 	private IDatabase database; | ||||
|  | ||||
| 	private String fullName; | ||||
| 	 | ||||
| 	private IWaveformDb db; | ||||
| 	 | ||||
| 	private ScvStream scvStream; | ||||
| 	 | ||||
| 	private TreeMap<Integer, TxGenerator> generators; | ||||
| 	 | ||||
| 	private TreeMap<Integer, ITx> transactions; | ||||
| 	 | ||||
| 	private Integer maxConcurrency; | ||||
| 	 | ||||
| 	private TreeMap<Long, List<ITxEvent>> events; | ||||
|  | ||||
| 	private List<RelationType> usedRelationsList; | ||||
| 	 | ||||
| 	public TxStream(IDatabase database, IWaveformDb waveformDb, ScvStream scvStream) { | ||||
| 		super(scvStream.getName()); | ||||
| 		this.database=database; | ||||
| 		fullName=scvStream.getName(); | ||||
| 		this.scvStream=scvStream; | ||||
| 		db=waveformDb; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public IWaveformDb getDb() { | ||||
| 		return db; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getFullName() { | ||||
| 		return fullName; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getId() { | ||||
| 		return (long) scvStream.getId(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getKind() { | ||||
| 		return scvStream.getKind(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public List<ITxGenerator> getGenerators() { | ||||
| 		if(generators==null){ | ||||
| 			SQLiteDatabaseSelectHandler<ScvGenerator> handler = new SQLiteDatabaseSelectHandler<ScvGenerator>( | ||||
| 					ScvGenerator.class, database, "stream="+scvStream.getId()); | ||||
| 			generators=new TreeMap<Integer, TxGenerator>(); | ||||
| 			try { | ||||
| 				for(ScvGenerator scvGenerator:handler.selectObjects()){ | ||||
| 					generators.put(scvGenerator.getId(), new TxGenerator(this, scvGenerator)); | ||||
| 				} | ||||
| 			} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | ||||
| 					| InvocationTargetException | SQLException | IntrospectionException e) { | ||||
| 				e.printStackTrace(); | ||||
| 			} | ||||
| 		} | ||||
| 		return new ArrayList<ITxGenerator>(generators.values()); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public int getMaxConcurrency() { | ||||
| 		if(maxConcurrency==null){ | ||||
| 			java.sql.Connection connection=null; | ||||
| 			java.sql.Statement statement=null; | ||||
| 			java.sql.ResultSet resultSet=null; | ||||
| 			try { | ||||
| 				connection = database.createConnection(); | ||||
| 				statement = connection.createStatement(); | ||||
| 				StringBuilder sb = new StringBuilder(); | ||||
| 				sb.append("SELECT MAX(concurrencyLevel) as concurrencyLevel FROM ScvTx where stream="); | ||||
| 				sb.append(scvStream.getId()); | ||||
| 				resultSet = statement.executeQuery(sb.toString()); | ||||
| 				while (resultSet.next()) { | ||||
| 					if(maxConcurrency==null) maxConcurrency=0; | ||||
| 					Object value = resultSet.getObject("concurrencyLevel"); | ||||
| 					if(value!=null) | ||||
| 						maxConcurrency=(Integer) value; | ||||
| 				} | ||||
| 			} catch (SQLException e) { | ||||
| 				if(maxConcurrency==null) maxConcurrency=0; | ||||
| 			} finally { | ||||
| 				try{ | ||||
| 				if(resultSet!=null) resultSet.close(); | ||||
| 				if(statement!=null) statement.close(); | ||||
| 				if(connection!=null) connection.close(); | ||||
| 				} catch (SQLException e) {	} | ||||
| 			} | ||||
| 			maxConcurrency+=1; | ||||
| 		} | ||||
| 		return maxConcurrency; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public  NavigableMap<Long, List<ITxEvent>> getEvents(){ | ||||
| 		if(events==null){ | ||||
| 			events=new TreeMap<Long, List<ITxEvent>>(); | ||||
| 			for(Entry<Integer, ITx> entry:getTransactions().entrySet()){ | ||||
| 				putEvent(new TxEvent(TxEvent.Type.BEGIN, entry.getValue())); | ||||
| 				putEvent(new TxEvent(TxEvent.Type.END, entry.getValue())); | ||||
| 			}	 | ||||
| 		} | ||||
| 		return events; | ||||
| 	} | ||||
|  | ||||
| 	private void putEvent(TxEvent ev){ | ||||
| 		Long time = ev.getTime(); | ||||
| 		if(!events.containsKey(time)){ | ||||
| 			Vector<ITxEvent> vector=new Vector<ITxEvent>(); | ||||
| 			vector.add(ev); | ||||
| 			events.put(time,  vector); | ||||
| 		} else { | ||||
| 			events.get(time).add(ev); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	protected Map<Integer, ITx> getTransactions() { | ||||
| 		if(transactions==null){ | ||||
| 			if(generators==null) getGenerators(); | ||||
| 			transactions = new TreeMap<Integer, ITx>(); | ||||
| 			SQLiteDatabaseSelectHandler<ScvTx> handler = new SQLiteDatabaseSelectHandler<ScvTx>(ScvTx.class, database, | ||||
| 					"stream="+scvStream.getId()); | ||||
| 			try { | ||||
| 				for(ScvTx scvTx:handler.selectObjects()){ | ||||
| 					transactions.put(scvTx.getId(), new Tx(database, this, generators.get(scvTx.getGenerator()), scvTx)); | ||||
| 				} | ||||
| 			} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | ||||
| 					| InvocationTargetException | SQLException | IntrospectionException e) { | ||||
| 				e.printStackTrace(); | ||||
| 			} | ||||
| 		} | ||||
| 		return transactions; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Collection<ITxEvent> getWaveformEventsAtTime(Long time) { | ||||
| 		return getEvents().get(time); | ||||
| 	} | ||||
|  | ||||
| 	public void setRelationTypeList(List<RelationType> usedRelationsList){ | ||||
| 		this.usedRelationsList=usedRelationsList; | ||||
| 	} | ||||
| 	 | ||||
| 	public RelationType getRelationType(String name) { | ||||
| 		RelationType relType=RelationType.create(name); | ||||
| 		if(!usedRelationsList.contains(relType)) usedRelationsList.add(relType); | ||||
| 		return relType; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Boolean equals(IWaveform other) { | ||||
| 		return(other instanceof TxStream && this.getId().equals(other.getId())); | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -1,46 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig"> | ||||
| <booleanAttribute key="append.args" value="true"/> | ||||
| <stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/> | ||||
| <booleanAttribute key="askclear" value="false"/> | ||||
| <booleanAttribute key="automaticAdd" value="true"/> | ||||
| <booleanAttribute key="automaticValidate" value="false"/> | ||||
| <stringAttribute key="bootstrap" value=""/> | ||||
| <stringAttribute key="checked" value="[NONE]"/> | ||||
| <booleanAttribute key="clearConfig" value="true"/> | ||||
| <booleanAttribute key="clearws" value="true"/> | ||||
| <booleanAttribute key="clearwslog" value="false"/> | ||||
| <stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/> | ||||
| <booleanAttribute key="default" value="true"/> | ||||
| <stringAttribute key="deselected_workspace_plugins" value="com.minres.scviewer.e4.application,com.minres.scviewer.ui"/> | ||||
| <booleanAttribute key="includeOptional" value="true"/> | ||||
| <stringAttribute key="location" value="${workspace_loc}/../junit-workspace"/> | ||||
| <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> | ||||
| <listEntry value="/com.minres.scviewer.database.test"/> | ||||
| </listAttribute> | ||||
| <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> | ||||
| <listEntry value="4"/> | ||||
| </listAttribute> | ||||
| <stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=com.minres.scviewer.database.test"/> | ||||
| <booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/> | ||||
| <stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/> | ||||
| <stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/> | ||||
| <booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/> | ||||
| <stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> | ||||
| <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/> | ||||
| <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/> | ||||
| <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.minres.scviewer.database.test"/> | ||||
| <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/> | ||||
| <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xms40m -Xmx512m"/> | ||||
| <stringAttribute key="pde.version" value="3.3"/> | ||||
| <stringAttribute key="product" value="com.minres.scviewer.e4.product"/> | ||||
| <booleanAttribute key="run_in_ui_thread" value="true"/> | ||||
| <stringAttribute key="selected_target_plugins" value="com.google.guava@default:default,javax.annotation@default:default,javax.inject@default:default,javax.servlet@default:default,org.apache.ant@default:default,org.apache.commons.jxpath@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.codehaus.groovy@default:default,org.eclipse.ant.core@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.filesystem.macosx@default:false,org.eclipse.core.filesystem@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.resources@default:default,org.eclipse.core.runtime@default:true,org.eclipse.core.variables@default:default,org.eclipse.e4.core.contexts@default:default,org.eclipse.e4.core.di.annotations@default:default,org.eclipse.e4.core.di.extensions@default:default,org.eclipse.e4.core.di@default:default,org.eclipse.e4.core.services@default:default,org.eclipse.e4.emf.xpath@default:default,org.eclipse.e4.ui.di@default:default,org.eclipse.e4.ui.model.workbench@default:default,org.eclipse.e4.ui.services@default:default,org.eclipse.emf.common@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.bidi@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.util@default:default,org.eclipse.jface@default:default,org.eclipse.osgi.compatibility.state@default:false,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.eclipse.swt.cocoa.macosx.x86_64@default:false,org.eclipse.swt@default:default,org.hamcrest.core@default:default,org.junit@default:default"/> | ||||
| <stringAttribute key="selected_workspace_plugins" value="com.minres.scviewer.database.sqlite@default:true,com.minres.scviewer.database.test@default:default,com.minres.scviewer.database.text@default:true,com.minres.scviewer.database.ui.swt@default:default,com.minres.scviewer.database.ui@default:default,com.minres.scviewer.database.vcd@default:default,com.minres.scviewer.database@default:true,com.opcoach.e4.preferences@default:default"/> | ||||
| <booleanAttribute key="show_selected_only" value="false"/> | ||||
| <booleanAttribute key="tracing" value="false"/> | ||||
| <booleanAttribute key="useCustomFeatures" value="false"/> | ||||
| <booleanAttribute key="useDefaultConfig" value="true"/> | ||||
| <booleanAttribute key="useDefaultConfigArea" value="false"/> | ||||
| <booleanAttribute key="useProduct" value="false"/> | ||||
| </launchConfiguration> | ||||
| @@ -1,2 +0,0 @@ | ||||
| /.scviewer.* | ||||
| /.my_db.txlog* | ||||
| @@ -1,2 +0,0 @@ | ||||
| eclipse.preferences.version=1 | ||||
| groovy.compiler.level=25 | ||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -1,260 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text; | ||||
|  | ||||
| import java.nio.charset.CharsetDecoder; | ||||
| import java.util.Collection; | ||||
| import java.util.zip.GZIPInputStream | ||||
|  | ||||
| import org.codehaus.groovy.ast.stmt.CatchStatement | ||||
| import org.mapdb.DB | ||||
| import org.mapdb.DBMaker | ||||
|  | ||||
| import groovy.io.FileType | ||||
|  | ||||
| import com.minres.scviewer.database.AssociationType | ||||
| import com.minres.scviewer.database.DataType | ||||
| import com.minres.scviewer.database.ITxGenerator | ||||
| import com.minres.scviewer.database.ITxStream | ||||
| import com.minres.scviewer.database.IWaveform | ||||
| import com.minres.scviewer.database.IWaveformDb | ||||
| import com.minres.scviewer.database.IWaveformDbLoader | ||||
| import com.minres.scviewer.database.RelationType | ||||
|  | ||||
| public class TextDbLoader implements IWaveformDbLoader{ | ||||
|  | ||||
| 	private Long maxTime; | ||||
|  | ||||
| 	IWaveformDb db; | ||||
|  | ||||
| 	def streams = [] | ||||
|  | ||||
| 	def relationTypes=[:] | ||||
|  | ||||
| 	DB mapDb | ||||
| 	 | ||||
| 	public TextDbLoader() { | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getMaxTime() { | ||||
| 		return maxTime; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public List<IWaveform> getAllWaves() { | ||||
| 		return new LinkedList<IWaveform>(streams); | ||||
| 	} | ||||
|  | ||||
| 	public Map<Long, ITxGenerator> getGeneratorsById() { | ||||
| 		TreeMap<Long, ITxGenerator> res = new TreeMap<Long, ITxGenerator>(); | ||||
| 		streams.each{TxStream stream -> stream.generators.each{res.put(it.id, id)} } | ||||
| 		return res; | ||||
| 	} | ||||
|  | ||||
| 	static final byte[] x = "scv_tr_stream".bytes | ||||
|  | ||||
| 	@Override | ||||
| 	boolean load(IWaveformDb db, File file) throws Exception { | ||||
| 		this.db=db | ||||
| 		this.streams=[] | ||||
| 		try { | ||||
| 			def gzipped = isGzipped(file) | ||||
| 			if(isTxfile(gzipped?new GZIPInputStream(new FileInputStream(file)):new FileInputStream(file))){ | ||||
| 				def mapDbFile = File.createTempFile("."+file.name, "tmp", file.parentFile) | ||||
| 				mapDbFile.delete() | ||||
| 				mapDbFile.deleteOnExit() | ||||
| 				this.mapDb = DBMaker | ||||
| 				.fileDB(mapDbFile) | ||||
| 				.fileMmapEnableIfSupported() | ||||
| 				.fileMmapPreclearDisable() | ||||
| 				.cleanerHackEnable() | ||||
| 				.allocateStartSize(64*1024*1024) | ||||
| 				.allocateIncrement(64*1024*1024) | ||||
| 				.make() | ||||
| 				// NPE here ---> | ||||
| 				parseInput(gzipped?new GZIPInputStream(new FileInputStream(file)):new FileInputStream(file)) | ||||
| 				calculateConcurrencyIndicees() | ||||
| 				return true | ||||
| 			} | ||||
| 		} catch (IndexOutOfBoundsException e) { | ||||
| 			return false | ||||
| 		} catch (IllegalArgumentException e) { | ||||
| 			return false | ||||
| 		} catch (NumberFormatException e) { | ||||
| 			return false | ||||
| 		} catch(EOFException e) { | ||||
| 			return true; | ||||
| 		} catch(Exception e) { | ||||
| 			System.out.println("---->>> Exception "+e.toString()+" caught while loading database"); | ||||
| 			//System.out.println("---->>> Exception "+e.toString()+" caught while loading database. StackTrace following... "); | ||||
| 			//e.printStackTrace() | ||||
| 		} | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	private static boolean isTxfile(InputStream istream) { | ||||
| 		byte[] buffer = new byte[x.size()] | ||||
| 		def readCnt = istream.read(buffer, 0, x.size()) | ||||
| 		istream.close() | ||||
| 		if(readCnt==x.size()){ | ||||
| 			for(int i=0; i<x.size(); i++) | ||||
| 				if(buffer[i]!=x[i]) return false | ||||
| 		} | ||||
| 		return true | ||||
| 	} | ||||
|  | ||||
| 	private static boolean isGzipped(File f) { | ||||
| 		InputStream is = null; | ||||
| 		try { | ||||
| 			is = new FileInputStream(f); | ||||
| 			byte [] signature = new byte[2]; | ||||
| 			int nread = is.read( signature ); //read the gzip signature | ||||
| 			return nread == 2 && signature[ 0 ] == (byte) 0x1f && signature[ 1 ] == (byte) 0x8b; | ||||
| 		} catch (IOException e) { | ||||
| 			return false; | ||||
| 		} finally { | ||||
| 			if(is!=null) is.close() | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	private stringToScale(String scale){ | ||||
| 		switch(scale.trim()){ | ||||
| 			case "fs":return 1L | ||||
| 			case "ps":return 1000L | ||||
| 			case "ns":return 1000000L | ||||
| 			case "us":return 1000000000L | ||||
| 			case "ms":return 1000000000000L | ||||
| 			case "s": return 1000000000000000L | ||||
| 		} | ||||
| 		return "fs" | ||||
| 	} | ||||
| 	 | ||||
| 	private def parseInput(InputStream inputStream){ | ||||
| 		def streamsById = [:] | ||||
| 		def generatorsById = [:] | ||||
| 		def transactionsById = [:] | ||||
| 		TxGenerator generator | ||||
| 		Tx transaction | ||||
| 		boolean endTransaction=false | ||||
| 		def matcher | ||||
| 		BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); | ||||
| 		long lineCnt=0; | ||||
| 		reader.eachLine { line -> | ||||
| 			def tokens = line.split(/\s+/) as ArrayList | ||||
| 			switch(tokens[0]){ | ||||
| 				case "scv_tr_stream": | ||||
| 				case "scv_tr_generator": | ||||
| 				case "begin_attribute": | ||||
| 				case "end_attribute": | ||||
| 					if ((matcher = line =~ /^scv_tr_stream\s+\(ID (\d+),\s+name\s+"([^"]+)",\s+kind\s+"([^"]+)"\)$/)) { | ||||
| 						def id = Integer.parseInt(matcher[0][1]) | ||||
| 						def stream = new TxStream(this, id, matcher[0][2], matcher[0][3]) | ||||
| 						streams<<stream | ||||
| 						streamsById[id]=stream | ||||
| 					} else if ((matcher = line =~ /^scv_tr_generator\s+\(ID\s+(\d+),\s+name\s+"([^"]+)",\s+scv_tr_stream\s+(\d+),$/)) { | ||||
| 						def id = Integer.parseInt(matcher[0][1]) | ||||
| 						ITxStream stream=streamsById[Integer.parseInt(matcher[0][3])] | ||||
| 						generator=new TxGenerator(id, stream, matcher[0][2]) | ||||
| 						stream.generators<<generator | ||||
| 						generatorsById[id]=generator | ||||
| 					} else if ((matcher = line =~ /^begin_attribute \(ID (\d+), name "([^"]+)", type "([^"]+)"\)$/)) { | ||||
| 						generator.begin_attrs << TxAttributeType.getAttrType(matcher[0][2], DataType.valueOf(matcher[0][3]), AssociationType.BEGIN) | ||||
| 					} else if ((matcher = line =~ /^end_attribute \(ID (\d+), name "([^"]+)", type "([^"]+)"\)$/)) { | ||||
| 						generator.end_attrs << TxAttributeType.getAttrType(matcher[0][2], DataType.valueOf(matcher[0][3]), AssociationType.END) | ||||
| 					} | ||||
| 					break; | ||||
| 				case ")": | ||||
| 					generator=null | ||||
| 					break | ||||
| 				case "tx_begin"://matcher = line =~ /^tx_begin\s+(\d+)\s+(\d+)\s+(\d+)\s+([munpf]?s)/ | ||||
| 					def id = Integer.parseInt(tokens[1]) | ||||
| 					TxGenerator gen=generatorsById[Integer.parseInt(tokens[2])] | ||||
| 					transaction = new Tx(id, gen.stream, gen, Long.parseLong(tokens[3])*stringToScale(tokens[4])) | ||||
| 					gen.transactions << transaction | ||||
| 					transactionsById[id]= transaction | ||||
| 					gen.begin_attrs_idx=0; | ||||
| 					maxTime = maxTime>transaction.beginTime?maxTime:transaction.beginTime | ||||
| 					endTransaction=false | ||||
| 					break | ||||
| 				case "tx_end"://matcher = line =~ /^tx_end\s+(\d+)\s+(\d+)\s+(\d+)\s+([munpf]?s)/ | ||||
| 					def id = Integer.parseInt(tokens[1]) | ||||
| 					transaction = transactionsById[id] | ||||
| 					assert Integer.parseInt(tokens[2])==transaction.generator.id | ||||
| 					transaction.endTime = Long.parseLong(tokens[3])*stringToScale(tokens[4]) | ||||
| 					transaction.generator.end_attrs_idx=0; | ||||
| 					maxTime = maxTime>transaction.endTime?maxTime:transaction.endTime | ||||
| 					endTransaction=true | ||||
| 					break | ||||
| 				case "tx_record_attribute"://matcher = line =~ /^tx_record_attribute\s+(\d+)\s+"([^"]+)"\s+(\S+)\s*=\s*(.+)$/ | ||||
| 					def id = Integer.parseInt(tokens[1]) | ||||
| 					def name = tokens[2][1..-2] | ||||
| 					def type = tokens[3] as DataType | ||||
| 					def remaining = tokens.size()>5?tokens[5..-1].join(' '):"" | ||||
| 					transactionsById[id].attributes<<new TxAttribute(name, type, AssociationType.RECORD, remaining) | ||||
| 					break | ||||
| 				case "a"://matcher = line =~ /^a\s+(.+)$/ | ||||
| 					if(endTransaction){ | ||||
| 						transaction.attributes << new TxAttribute(transaction.generator.end_attrs[transaction.generator.end_attrs_idx], tokens[1]) | ||||
| 						transaction.generator.end_attrs_idx++ | ||||
| 					} else { | ||||
| 						transaction.attributes << new TxAttribute(transaction.generator.begin_attrs[transaction.generator.begin_attrs_idx], tokens[1]) | ||||
| 						transaction.generator.begin_attrs_idx++ | ||||
| 					} | ||||
| 					break | ||||
| 				case "tx_relation"://matcher = line =~ /^tx_relation\s+\"(\S+)\"\s+(\d+)\s+(\d+)$/ | ||||
| 					Tx tr2= transactionsById[Integer.parseInt(tokens[2])] | ||||
| 					Tx tr1= transactionsById[Integer.parseInt(tokens[3])] | ||||
| 					def relType=tokens[1][1..-2] | ||||
| 					if(!relationTypes.containsKey(relType)) relationTypes[relType]=RelationType.create(relType) | ||||
| 					def rel = new TxRelation(relationTypes[relType], tr1, tr2) | ||||
| 					tr1.outgoingRelations<<rel | ||||
| 					tr2.incomingRelations<<rel | ||||
| 					break | ||||
| 				default: | ||||
| 					println "Don't know what to do with: '$line'" | ||||
|  | ||||
| 			} | ||||
| 			lineCnt++ | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	private def toDataType(String str){ | ||||
| 		switch (str) | ||||
| 		{ | ||||
| 			case "BOOLEAN": return DataType.                       BOOLEAN                       | ||||
| 			case "ENUMERATION": return DataType.                   ENUMERATION                   | ||||
| 			case "INTEGER": return DataType.                       INTEGER                       | ||||
| 			case "UNSIGNED": return DataType.                      UNSIGNED                      | ||||
| 			case "FLOATING_POINT_NUMBER": return DataType.         FLOATING_POINT_NUMBER         | ||||
| 			case "BIT_VECTOR": return DataType.                    BIT_VECTOR                    | ||||
| 			case "LOGIC_VECTOR": return DataType.                  LOGIC_VECTOR                  | ||||
| 			case "FIXED_POINT_INTEGER": return DataType.           FIXED_POINT_INTEGER           | ||||
| 			case "UNSIGNED_FIXED_POINT_INTEGER": return DataType.  UNSIGNED_FIXED_POINT_INTEGER  | ||||
| 			case "RECORD": return DataType.                        RECORD                        | ||||
| 			case "POINTER": return DataType.                       POINTER                       | ||||
| 			case "ARRAY": return DataType.                         ARRAY                         | ||||
| 			case "STRING": return DataType.                        STRING | ||||
| 			default: return DataType.INTEGER | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	private def calculateConcurrencyIndicees(){ | ||||
| 		streams.each{ TxStream  stream -> stream.getMaxConcurrency() } | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	public Collection<RelationType> getAllRelationTypes(){ | ||||
| 		return relationTypes.values(); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| @@ -1,67 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text | ||||
|  | ||||
| import com.minres.scviewer.database.* | ||||
|  | ||||
| class Tx implements ITx { | ||||
| 	 | ||||
| 	Long id | ||||
| 	 | ||||
| 	TxGenerator generator | ||||
|  | ||||
| 	TxStream stream | ||||
| 	 | ||||
| 	int concurrencyIndex | ||||
| 	 | ||||
| 	Long beginTime | ||||
| 	 | ||||
| 	Long endTime | ||||
| 	 | ||||
| 	ArrayList<ITxAttribute> attributes = new ArrayList<ITxAttribute>() | ||||
| 	 | ||||
| 	def incomingRelations =[] | ||||
| 	 | ||||
| 	def outgoingRelations =[] | ||||
| 	 | ||||
| 	Tx(int id, TxStream stream, TxGenerator generator, Long begin){ | ||||
| 		this.id=id | ||||
| 		this.stream=stream | ||||
| 		this.generator=generator | ||||
| 		this.beginTime=begin | ||||
|         this.endTime=begin | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public Collection<ITxRelation> getIncomingRelations() { | ||||
| 		return incomingRelations; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Collection<ITxRelation> getOutgoingRelations() { | ||||
| 		return outgoingRelations; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public int compareTo(ITx o) { | ||||
| 		def res =beginTime.compareTo(o.beginTime) | ||||
| 		if(res!=0)  | ||||
| 			return res | ||||
| 		else | ||||
| 			return id.compareTo(o.id) | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public String toString() { | ||||
| 		return "tx#"+getId()+"["+getBeginTime()/1000000+"ns - "+getEndTime()/1000000+"ns]"; | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -1,59 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text | ||||
|  | ||||
| import com.minres.scviewer.database.AssociationType; | ||||
| import com.minres.scviewer.database.DataType; | ||||
| import com.minres.scviewer.database.ITxAttributeType; | ||||
| import com.minres.scviewer.database.ITxAttribute | ||||
|  | ||||
| class TxAttribute  implements ITxAttribute{ | ||||
| 	 | ||||
| 	TxAttributeType attributeType | ||||
|  | ||||
| 	def value | ||||
| 	 | ||||
| 	TxAttribute(String name, DataType dataType, AssociationType type, value){ | ||||
| 		attributeType = TxAttributeTypeFactory.instance.getAttrType(name, dataType, type) | ||||
| 		switch(dataType){ | ||||
| 			case DataType.STRING: | ||||
| 			case DataType.ENUMERATION: | ||||
| 				this.value=value[1..-2] | ||||
| 				break; | ||||
| 			default: | ||||
| 				this.value=value | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	TxAttribute(TxAttributeType other){ | ||||
| 		attributeType=other | ||||
| 	} | ||||
| 	 | ||||
| 	TxAttribute(TxAttributeType other, value){ | ||||
| 		this(other.name, other.dataType, other.type, value) | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getName() { | ||||
| 		return attributeType.getName(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public AssociationType getType() { | ||||
| 		attributeType.type; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public DataType getDataType() { | ||||
| 		attributeType.dataType; | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -1,31 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text | ||||
|  | ||||
| import com.minres.scviewer.database.AssociationType; | ||||
| import com.minres.scviewer.database.DataType; | ||||
| import com.minres.scviewer.database.ITxAttributeType; | ||||
|  | ||||
| class TxAttributeType implements ITxAttributeType { | ||||
| 	String name | ||||
| 	DataType dataType | ||||
| 	AssociationType type | ||||
| 	 | ||||
| 	static TxAttributeType getAttrType(String name, DataType dataType, AssociationType type){ | ||||
| 		TxAttributeTypeFactory.instance.getAttrType(name, dataType, type) | ||||
| 	} | ||||
| 	 | ||||
| 	TxAttributeType(String name, DataType dataType, AssociationType type){ | ||||
| 		this.name=name | ||||
| 		this.dataType=dataType | ||||
| 		this.type=type | ||||
| 	} | ||||
| } | ||||
| @@ -1,38 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text | ||||
|  | ||||
| import com.minres.scviewer.database.AssociationType; | ||||
| import com.minres.scviewer.database.DataType | ||||
| import com.minres.scviewer.database.ITxAttributeType | ||||
| import com.minres.scviewer.database.ITxAttribute | ||||
|  | ||||
| class TxAttributeTypeFactory { | ||||
| 	private static final instance = new TxAttributeTypeFactory() | ||||
| 	 | ||||
| 	def attributes = [:] | ||||
| 	 | ||||
| 	private TxAttributeTypeFactory() { | ||||
| 		TxAttributeTypeFactory.metaClass.constructor = {-> instance } | ||||
| 	} | ||||
| 	 | ||||
| 	ITxAttributeType getAttrType(String name, DataType dataType, AssociationType type){ | ||||
| 		def key = name+":"+dataType.toString() | ||||
| 		ITxAttributeType res | ||||
| 		if(attributes.containsKey(key)){ | ||||
| 			res=attributes[key] | ||||
| 		} else { | ||||
| 			res=new TxAttributeType(name, dataType, type) | ||||
| 			attributes[key]=res | ||||
| 		} | ||||
| 		return res | ||||
| 	} | ||||
| } | ||||
| @@ -1,36 +0,0 @@ | ||||
| package com.minres.scviewer.database.text; | ||||
|  | ||||
| import com.minres.scviewer.database.ITx | ||||
| import com.minres.scviewer.database.ITxEvent | ||||
| import com.minres.scviewer.database.IWaveformEvent | ||||
|  | ||||
| class TxEvent implements ITxEvent { | ||||
|  | ||||
| 	final ITxEvent.Type type; | ||||
| 	 | ||||
| 	final Tx transaction; | ||||
| 	 | ||||
| 	final Long time | ||||
| 	 | ||||
| 	TxEvent(ITxEvent.Type type, ITx transaction) { | ||||
| 		super(); | ||||
| 		this.type = type; | ||||
| 		this.transaction = transaction; | ||||
| 		this.time = type==ITxEvent.Type.BEGIN?transaction.beginTime:transaction.endTime | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	IWaveformEvent duplicate() throws CloneNotSupportedException { | ||||
| 		new TxEvent(type, transaction, time) | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	int compareTo(IWaveformEvent o) { | ||||
| 		time.compareTo(o.time) | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	String toString() { | ||||
| 		type.toString()+"@"+time+" of tx #"+transaction.id; | ||||
| 	} | ||||
| } | ||||
| @@ -1,52 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
|  | ||||
| import com.minres.scviewer.database.ITxAttributeType | ||||
| import com.minres.scviewer.database.ITxAttribute; | ||||
| import com.minres.scviewer.database.ITxEvent; | ||||
| import com.minres.scviewer.database.ITxGenerator; | ||||
| import com.minres.scviewer.database.ITxStream; | ||||
| import com.minres.scviewer.database.ITx; | ||||
| import com.minres.scviewer.database.IWaveformEvent; | ||||
|  | ||||
| class TxGenerator implements ITxGenerator{ | ||||
| 	Long id | ||||
| 	TxStream stream | ||||
| 	String name | ||||
| 	Boolean active = false | ||||
| 	ArrayList<ITx> transactions=[] | ||||
| 	 | ||||
| 	ArrayList<ITxAttributeType> begin_attrs = [] | ||||
| 	int begin_attrs_idx = 0 | ||||
| 	ArrayList<ITxAttributeType> end_attrs= [] | ||||
| 	int end_attrs_idx = 0 | ||||
| 	 | ||||
| 	TxGenerator(int id, TxStream stream, name){ | ||||
| 		this.id=id | ||||
| 		this.stream=stream | ||||
| 		this.name=name | ||||
| 	} | ||||
| 	 | ||||
| 	ITxStream<? extends ITxEvent> getStream(){ | ||||
| 		return stream; | ||||
| 	} | ||||
| 	 | ||||
| 	List<ITx> getTransactions(){ | ||||
| 		return transactions | ||||
| 	} | ||||
| 	 | ||||
| 	Boolean isActive() {return active}; | ||||
| 	 | ||||
| } | ||||
| @@ -1,36 +0,0 @@ | ||||
| package com.minres.scviewer.database.text | ||||
|  | ||||
| import com.minres.scviewer.database.ITxRelation | ||||
| import com.minres.scviewer.database.ITx; | ||||
| import com.minres.scviewer.database.RelationType; | ||||
|  | ||||
| class TxRelation implements ITxRelation { | ||||
| 	Tx source | ||||
| 	 | ||||
| 	Tx target | ||||
| 	 | ||||
| 	RelationType relationType | ||||
| 	 | ||||
| 	 | ||||
| 	public TxRelation(RelationType relationType, Tx source, Tx target) { | ||||
| 		this.source = source; | ||||
| 		this.target = target; | ||||
| 		this.relationType = relationType; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public RelationType getRelationType() { | ||||
| 		return relationType; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public ITx getSource() { | ||||
| 		return source; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public ITx getTarget() { | ||||
| 		return target; | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -1,119 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text | ||||
|  | ||||
| import java.beans.PropertyChangeListener; | ||||
| import java.util.Collection; | ||||
| import java.util.Comparator; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.NavigableMap; | ||||
|  | ||||
| import org.mapdb.Serializer | ||||
|  | ||||
| import com.minres.scviewer.database.ITxEvent; | ||||
| import com.minres.scviewer.database.IWaveform; | ||||
| import com.minres.scviewer.database.IWaveformDb | ||||
| import com.minres.scviewer.database.IWaveformEvent | ||||
| import com.minres.scviewer.database.ITxGenerator | ||||
| import com.minres.scviewer.database.HierNode; | ||||
| import com.minres.scviewer.database.IHierNode | ||||
| import com.minres.scviewer.database.ITxStream | ||||
| import com.minres.scviewer.database.ITx | ||||
|  | ||||
| class TxStream extends HierNode implements ITxStream { | ||||
|  | ||||
| 	Long id | ||||
| 	 | ||||
| 	IWaveformDb database | ||||
| 	 | ||||
| 	String fullName | ||||
| 	 | ||||
| 	String kind | ||||
| 	 | ||||
| 	def generators = [] | ||||
| 	 | ||||
| 	int maxConcurrency | ||||
| 	 | ||||
| 	private TreeMap<Long, List<ITxEvent>> events | ||||
| 	 | ||||
| 	TxStream(TextDbLoader loader, int id, String name, String kind){ | ||||
| 		super(name) | ||||
| 		this.id=id | ||||
| 		this.database=loader.db | ||||
| 		this.fullName=name | ||||
| 		this.kind=kind | ||||
| 		this.maxConcurrency=0 | ||||
| 		//events = new TreeMap<Long, List<ITxEvent>>() | ||||
| 		events = loader.mapDb.treeMap(name).keySerializer(Serializer.LONG).createOrOpen(); | ||||
| 	} | ||||
|  | ||||
| 	List<ITxGenerator> getGenerators(){ | ||||
| 		return generators as List<ITxGenerator> | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public IWaveformDb getDb() { | ||||
| 		return database | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public int getMaxConcurrency() { | ||||
| 		if(!maxConcurrency){ | ||||
| 			generators.each {TxGenerator generator -> | ||||
| 				generator.transactions.each{ Tx tx -> | ||||
| 					putEvent(new TxEvent(ITxEvent.Type.BEGIN, tx)) | ||||
| 					putEvent(new TxEvent(ITxEvent.Type.END, tx)) | ||||
| 				} | ||||
| 			} | ||||
| 			def rowendtime = [0] | ||||
| 			events.keySet().each{long time -> | ||||
| 				def value=events.get(time) | ||||
| 				def starts=value.findAll{ITxEvent event ->event.type==ITxEvent.Type.BEGIN} | ||||
| 				starts.each {ITxEvent event -> | ||||
| 					Tx tx = event.transaction | ||||
| 					def rowIdx = 0 | ||||
| 					for(rowIdx=0; rowIdx<rowendtime.size() && rowendtime[rowIdx]>tx.beginTime; rowIdx++); | ||||
| 					if(rowendtime.size<=rowIdx) | ||||
| 						rowendtime<<tx.endTime | ||||
| 					else | ||||
| 						rowendtime[rowIdx]=tx.endTime | ||||
| 					tx.concurrencyIndex=rowIdx | ||||
| 				} | ||||
| 			} | ||||
| 			maxConcurrency=rowendtime.size() | ||||
| 		} | ||||
| 		return maxConcurrency | ||||
| 	} | ||||
|  | ||||
| 	private putEvent(ITxEvent event){ | ||||
| 		if(!events.containsKey(event.time))  | ||||
| 			events.put(event.time, [event]) | ||||
| 		else | ||||
| 			events[event.time]<<event | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public NavigableMap getEvents() { | ||||
| 		return events; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Collection getWaveformEventsAtTime(Long time) { | ||||
| 		return events.get(time); | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public Boolean equals(IWaveform other) { | ||||
| 		return(other instanceof TxStream && this.getId()==other.getId()); | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -1,9 +0,0 @@ | ||||
| package com.minres.scviewer.database.swt; | ||||
|  | ||||
| public class Constants { | ||||
|  | ||||
| 	public final static String[] unitString={"fs", "ps", "ns", "us", "ms"};//, "s"}; | ||||
|      | ||||
|     public final static int[] unitMultiplier={1, 3, 10, 30, 100, 300}; | ||||
|  | ||||
| } | ||||
| @@ -1,198 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.swt.internal; | ||||
|  | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
| import java.util.Map.Entry; | ||||
| import java.util.NavigableMap; | ||||
| import java.util.TreeSet; | ||||
|  | ||||
| import org.eclipse.swt.SWT; | ||||
| import org.eclipse.swt.graphics.GC; | ||||
| import org.eclipse.swt.graphics.Point; | ||||
| import org.eclipse.swt.graphics.Rectangle; | ||||
|  | ||||
| import com.minres.scviewer.database.ITx; | ||||
| import com.minres.scviewer.database.ITxEvent; | ||||
| import com.minres.scviewer.database.ITxStream; | ||||
| import com.minres.scviewer.database.ui.TrackEntry; | ||||
| import com.minres.scviewer.database.ui.WaveformColors; | ||||
|  | ||||
| public class StreamPainter extends TrackPainter{ | ||||
|  | ||||
| 	/** | ||||
| 	 *  | ||||
| 	 */ | ||||
| 	private final WaveformCanvas waveCanvas; | ||||
| 	private ITxStream<? extends ITxEvent> stream; | ||||
| 	private int txBase, txHeight; | ||||
| 	private boolean even; | ||||
| 	private TreeSet<ITx> seenTx; | ||||
|  | ||||
| 	public StreamPainter(WaveformCanvas waveCanvas, boolean even, TrackEntry trackEntry) { | ||||
| 		super(trackEntry, even); | ||||
| 		this.waveCanvas = waveCanvas; | ||||
| 		this.stream=trackEntry.getStream(); | ||||
| 		this.seenTx=new TreeSet<ITx>(); | ||||
| 	} | ||||
|      | ||||
| 	/* | ||||
| 	 * convert java.awt.Color to org.eclipse.swt.graphics.Color  | ||||
| 	 */ | ||||
| 	static org.eclipse.swt.graphics.Color toSwtColor( GC gc, java.awt.Color awtColor ){ | ||||
| 		return new org.eclipse.swt.graphics.Color( gc.getDevice(), awtColor.getRed(), awtColor.getGreen(), awtColor.getBlue() ); | ||||
| 	} | ||||
|  | ||||
| 	static org.eclipse.swt.graphics.Color[] toSwtColors( GC gc, java.awt.Color[] awtColors ){ | ||||
| 		org.eclipse.swt.graphics.Color[] swtColors = new org.eclipse.swt.graphics.Color[awtColors.length]; | ||||
| 		for( int i=0; i<awtColors.length; i++ ) | ||||
| 			swtColors[i] = toSwtColor( gc, awtColors[i] ); | ||||
| 		return swtColors; | ||||
| 	} | ||||
|  | ||||
| 	@SuppressWarnings("unchecked") | ||||
| 	public void paintArea(GC gc, Rectangle area) { | ||||
| 		if(stream.getEvents().size()==0) return; | ||||
| 		int trackHeight=trackEntry.height/stream.getMaxConcurrency(); | ||||
| 		txBase=trackHeight/5; | ||||
| 		txHeight=trackHeight*3/5; | ||||
| 		if(trackEntry.selected) { | ||||
| 			gc.setBackground(this.waveCanvas.colors[WaveformColors.TRACK_BG_HIGHLITE.ordinal()]); | ||||
| 		} | ||||
| 		else | ||||
| 			gc.setBackground(this.waveCanvas.colors[even?WaveformColors.TRACK_BG_EVEN.ordinal():WaveformColors.TRACK_BG_ODD.ordinal()]); | ||||
| 		gc.setFillRule(SWT.FILL_EVEN_ODD); | ||||
| 		gc.fillRectangle(area); | ||||
| 		 | ||||
| 		long scaleFactor = this.waveCanvas.getScaleFactor(); | ||||
| 		long beginPos = area.x; | ||||
| 		long beginTime = (beginPos + waveCanvas.getXOffset())*scaleFactor; | ||||
| 		//long endPos = beginPos + area.width; | ||||
|         long endTime = beginTime + area.width*scaleFactor; | ||||
|  | ||||
| 		Entry<Long, ?> firstTx=stream.getEvents().floorEntry(beginTime); | ||||
| 		Entry<Long, ?> lastTx=stream.getEvents().ceilingEntry(endTime); | ||||
| 		if(firstTx==null) firstTx = stream.getEvents().firstEntry(); | ||||
| 		if(lastTx==null) lastTx=stream.getEvents().lastEntry(); | ||||
|         gc.setFillRule(SWT.FILL_EVEN_ODD); | ||||
|         gc.setLineStyle(SWT.LINE_SOLID); | ||||
|         gc.setLineWidth(1); | ||||
|         gc.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]); | ||||
|          | ||||
|         for( int y1=area.y+trackHeight/2; y1<area.y+trackEntry.height; y1+=trackHeight) | ||||
|         	gc.drawLine(area.x, y1, area.x+area.width, y1); | ||||
| 		if(firstTx==lastTx) { | ||||
| 			for(ITxEvent txEvent:(Collection<?  extends ITxEvent>)firstTx.getValue()) | ||||
| 				drawTx(gc, area, txEvent.getTransaction(), false); | ||||
| 		}else{ | ||||
| 			seenTx.clear(); | ||||
| 			NavigableMap<Long,?> entries = stream.getEvents().subMap(firstTx.getKey(), true, lastTx.getKey(), true); | ||||
| 			boolean highlighed=false; | ||||
| 	        gc.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]); | ||||
| 	         | ||||
| 	        for(Entry<Long, ?> entry: entries.entrySet()) | ||||
| 				for(ITxEvent txEvent:(Collection<?  extends ITxEvent>)entry.getValue()){ | ||||
| 					if(txEvent.getType()==ITxEvent.Type.BEGIN) | ||||
| 						seenTx.add(txEvent.getTransaction()); | ||||
| 					if(txEvent.getType()==ITxEvent.Type.END){ | ||||
| 						ITx tx = txEvent.getTransaction(); | ||||
| 						highlighed|=waveCanvas.currentSelection!=null && waveCanvas.currentSelection.equals(tx); | ||||
| 						drawTx(gc, area, tx, false); | ||||
| 						seenTx.remove(tx); | ||||
| 					} | ||||
| 				} | ||||
| 			for(ITx tx:seenTx){ | ||||
| 				drawTx(gc, area, tx, false); | ||||
| 			} | ||||
| 			if(highlighed){ | ||||
| 		        gc.setForeground(this.waveCanvas.colors[WaveformColors.LINE_HIGHLITE.ordinal()]); | ||||
| 		        drawTx(gc, area, waveCanvas.currentSelection, true); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	protected void drawTx(GC gc, Rectangle area, ITx tx, boolean highlighted ) { | ||||
| 		// compute colors | ||||
|         java.awt.Color[] fallbackColors = trackEntry.getColors(); | ||||
|         java.awt.Color[] transColor = TrackEntry.computeColor( tx.getGenerator().getName(), fallbackColors[0], fallbackColors[1] ); | ||||
|          | ||||
|         gc.setBackground( toSwtColor( gc, transColor[highlighted?1:0] ) ); | ||||
|          | ||||
| 		int offset = tx.getConcurrencyIndex()*this.waveCanvas.getTrackHeight(); | ||||
| 		Rectangle bb = new Rectangle( | ||||
| 				(int)(tx.getBeginTime()/this.waveCanvas.getScaleFactor()-waveCanvas.getXOffset()), area.y+offset+txBase, | ||||
| 				(int)((tx.getEndTime()-tx.getBeginTime())/this.waveCanvas.getScaleFactor()), txHeight); | ||||
|  | ||||
| 		if(bb.x+bb.width<area.x || bb.x>area.x+area.width) return; | ||||
| 		if(bb.width==0){ | ||||
| 			gc.drawLine(bb.x, bb.y, bb.x, bb.y+bb.height); | ||||
| 		} else if(bb.width<10){ | ||||
| 			gc.fillRectangle(bb); | ||||
| 			gc.drawRectangle(bb); | ||||
| 		} else { | ||||
| 			if(bb.x < area.x) { | ||||
| 				bb.width = bb.width-(area.x-bb.x)+5; | ||||
| 				bb.x=area.x-5; | ||||
| 			} | ||||
| 			int bb_x2 = bb.x+bb.width; | ||||
| 			int area_x2 = area.x+area.width; | ||||
| 			if(bb_x2>area_x2){ | ||||
| 				bb_x2=area_x2+5; | ||||
| 				bb.width= bb_x2-bb.x; | ||||
| 			} | ||||
| 			gc.fillRoundRectangle(bb.x, bb.y, bb.width, bb.height, 5, 5); | ||||
| 		    gc.drawRoundRectangle(bb.x, bb.y, bb.width, bb.height, 5, 5); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	public ITx getClicked(Point point) { | ||||
| 		int lane=point.y/waveCanvas.getTrackHeight(); | ||||
| 		Entry<Long, List<ITxEvent>> firstTx=stream.getEvents().floorEntry(point.x*waveCanvas.getScaleFactor()); | ||||
| 		if(firstTx!=null){ | ||||
| 			do { | ||||
| 				ITx tx = getTxFromEntry(lane, point.x, firstTx); | ||||
| 				if(tx!=null) return tx; | ||||
| 				firstTx=stream.getEvents().lowerEntry(firstTx.getKey()); | ||||
| 			}while(firstTx!=null); | ||||
| 		} | ||||
| 		return null; | ||||
| 	} | ||||
|  | ||||
| 	public ITxStream<? extends ITxEvent> getStream() { | ||||
| 		return stream; | ||||
| 	} | ||||
|  | ||||
| 	public void setStream(ITxStream<? extends ITxEvent> stream) { | ||||
| 		this.stream = stream; | ||||
| 	} | ||||
|  | ||||
| 	protected ITx getTxFromEntry(int lane, int offset, Entry<Long, List<ITxEvent>> firstTx) { | ||||
|         long timePoint=offset*waveCanvas.getScaleFactor(); | ||||
| 		for(ITxEvent evt:firstTx.getValue()){ | ||||
| 		    ITx tx=evt.getTransaction(); | ||||
| 			if(evt.getType()==ITxEvent.Type.BEGIN && tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePoint && tx.getEndTime()>=timePoint){ | ||||
| 				return evt.getTransaction(); | ||||
| 			} | ||||
| 		} | ||||
| 		// now with some fuzziness | ||||
|         timePoint=(offset-5)*waveCanvas.getScaleFactor(); | ||||
|         long timePointHigh=(offset+5)*waveCanvas.getScaleFactor(); | ||||
|         for(ITxEvent evt:firstTx.getValue()){ | ||||
|             ITx tx=evt.getTransaction(); | ||||
|             if(evt.getType()==ITxEvent.Type.BEGIN && tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePointHigh && tx.getEndTime()>=timePoint){ | ||||
|                 return evt.getTransaction(); | ||||
|             } | ||||
|         } | ||||
| 		return null; | ||||
| 	} | ||||
|  | ||||
| } | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,7 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <classpath> | ||||
| 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> | ||||
| 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> | ||||
| 	<classpathentry kind="src" path="src"/> | ||||
| 	<classpathentry kind="output" path="bin"/> | ||||
| </classpath> | ||||
| @@ -1,28 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <projectDescription> | ||||
| 	<name>com.minres.scviewer.database.ui</name> | ||||
| 	<comment></comment> | ||||
| 	<projects> | ||||
| 	</projects> | ||||
| 	<buildSpec> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.jdt.core.javabuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.pde.ManifestBuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.pde.SchemaBuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 	</buildSpec> | ||||
| 	<natures> | ||||
| 		<nature>org.eclipse.pde.PluginNature</nature> | ||||
| 		<nature>org.eclipse.jdt.core.javanature</nature> | ||||
| 	</natures> | ||||
| </projectDescription> | ||||
| @@ -1,7 +0,0 @@ | ||||
| eclipse.preferences.version=1 | ||||
| org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled | ||||
| org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 | ||||
| org.eclipse.jdt.core.compiler.compliance=1.8 | ||||
| org.eclipse.jdt.core.compiler.problem.assertIdentifier=error | ||||
| org.eclipse.jdt.core.compiler.problem.enumIdentifier=error | ||||
| org.eclipse.jdt.core.compiler.source=1.8 | ||||
| @@ -1,11 +0,0 @@ | ||||
| Manifest-Version: 1.0 | ||||
| Bundle-ManifestVersion: 2 | ||||
| Bundle-Name: Database UI | ||||
| Bundle-SymbolicName: com.minres.scviewer.database.ui | ||||
| Bundle-Version: 2.0.0.qualifier | ||||
| Bundle-Vendor: MINRES Technologies GmbH | ||||
| Bundle-RequiredExecutionEnvironment: JavaSE-1.8 | ||||
| Export-Package: com.minres.scviewer.database.ui | ||||
| Require-Bundle: com.minres.scviewer.database, | ||||
|  org.eclipse.jface | ||||
| Automatic-Module-Name: com.minres.scviewer.database.ui | ||||
| @@ -1,4 +0,0 @@ | ||||
| source.. = src/ | ||||
| output.. = bin/ | ||||
| bin.includes = META-INF/,\ | ||||
|                . | ||||
| @@ -1,12 +0,0 @@ | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|   <modelVersion>4.0.0</modelVersion> | ||||
|   <artifactId>com.minres.scviewer.database.ui</artifactId> | ||||
|   <version>2.0.0-SNAPSHOT</version> | ||||
|   <packaging>eclipse-plugin</packaging> | ||||
|   <parent> | ||||
|   	<groupId>com.minres.scviewer</groupId> | ||||
|   	<artifactId>com.minres.scviewer.parent</artifactId> | ||||
|   	<version>2.0.0-SNAPSHOT</version> | ||||
|   	<relativePath>../com.minres.scviewer.parent</relativePath> | ||||
|   </parent> | ||||
|   </project> | ||||
| @@ -1,151 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.ui; | ||||
|  | ||||
|  | ||||
| import java.awt.Color; | ||||
|  | ||||
| import com.minres.scviewer.database.ISignal; | ||||
| import com.minres.scviewer.database.ITxEvent; | ||||
| import com.minres.scviewer.database.ITxStream; | ||||
| import com.minres.scviewer.database.IWaveform; | ||||
|  | ||||
| public class TrackEntry { | ||||
|  | ||||
|  	// color info | ||||
| 	public static Color fallbackColor = new Color(200,0,0); | ||||
| 	public static Color highlightedFallbackColor = new Color(255,0,0); | ||||
| 	private Color[]signalColors; | ||||
| 	 | ||||
| 	// list of random colors | ||||
| 	private static Color[][] randomColors = { | ||||
| 			{ new Color( 170,  66,  37 ), new Color ( 190,  66,  37 ) }, | ||||
| 			{ new Color(  96,  74, 110 ), new Color (  96,  74, 130 ) }, | ||||
| 			{ new Color( 133, 105, 128 ), new Color ( 153, 105, 128 ) }, | ||||
| 			{ new Color(   0, 126, 135 ), new Color (   0, 126, 155 ) }, | ||||
| 			{ new Color( 243, 146,  75 ), new Color ( 255, 146,  75 ) }, | ||||
| 			{ new Color( 206, 135, 163 ), new Color ( 226, 135, 163 ) }, | ||||
| 			{ new Color( 124, 103,  74 ), new Color ( 144, 103,  74 ) }, | ||||
| 			{ new Color( 194, 187, 169 ), new Color ( 214, 187, 169 ) }, | ||||
| 			{ new Color( 104,  73,  71 ), new Color ( 124,  73,  71 ) }, | ||||
| 			{ new Color(  75, 196, 213 ), new Color (  75, 196, 233 ) }, | ||||
| 			{ new Color( 206, 232, 229 ), new Color ( 206, 252, 229 ) }, | ||||
| 			{ new Color( 169, 221, 199 ), new Color ( 169, 241, 199 ) }, | ||||
| 			{ new Color( 100, 165, 197 ), new Color ( 100, 165, 217 ) }, | ||||
| 			{ new Color( 150, 147, 178 ), new Color ( 150, 147, 198 ) }, | ||||
| 			{ new Color( 200, 222, 182 ), new Color ( 200, 242, 182 ) }, | ||||
| 			{ new Color( 147, 208, 197 ), new Color ( 147, 228, 197 ) } | ||||
| 	}; | ||||
| 	 | ||||
| 	public static Color[] computeColor (String streamValue, Color fallback, Color highlightedFallback) { | ||||
| 	 | ||||
| 		Color[]result = new Color[2]; | ||||
| 				 | ||||
| 		result[0] = fallback; | ||||
| 		result[1] = highlightedFallback; | ||||
| 		 | ||||
| 		// assign colors to standard values | ||||
| 		if (streamValue.contains("read")){ | ||||
| 			result[0] = new Color(86,174,53); | ||||
| 			result[1] = new Color (86,194,53); | ||||
| 		}else if (streamValue.contains("rdata")){ | ||||
| 			result[0] = new Color(138,151,71); | ||||
| 			result[1] = new Color (138,171,71); | ||||
| 		}else if (streamValue.contains("addr")){ | ||||
| 			result[0] = new Color(233,187,68); | ||||
| 			result[1] = new Color (233,207,68); | ||||
| 		}else if (streamValue.contains("write")){ | ||||
| 			result[0] = new Color(1,128,191); | ||||
| 			result[1] = new Color (1,128,211); | ||||
| 		}else if (streamValue.contains("wdata")){ | ||||
| 			result[0] = new Color(2,181,160); | ||||
| 			result[1] = new Color (2,201,160); | ||||
| 			 | ||||
| 		}else { | ||||
| 			// assign "random" color here, one name always results in the same color! | ||||
| 			if( randomColors.length > 0 ) { | ||||
| 				int index = Math.abs(streamValue.hashCode()) % randomColors.length; | ||||
| 				result[0] = randomColors[index][0]; | ||||
| 				result[1] = randomColors[index][1]; | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 		return result; | ||||
| 		 | ||||
| 	} | ||||
| 	 | ||||
| 	public void setColor(Color changedColor, Color highlightColor) { | ||||
| 		signalColors[0] = changedColor; | ||||
| 		signalColors[1] = highlightColor; | ||||
| 	} | ||||
| 	 | ||||
| 	public Color[] getColors() { | ||||
| 		return signalColors; | ||||
| 	} | ||||
| 	 | ||||
| 	public enum ValueDisplay { | ||||
| 		DEFAULT, SIGNED, UNSIGNED | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	public enum WaveDisplay { | ||||
| 		DEFAULT, STEP_WISE, CONTINOUS | ||||
| 	} | ||||
|  | ||||
| 	final public IWaveform waveform; | ||||
|  | ||||
| 	public int vOffset; | ||||
| 	 | ||||
| 	public int height; | ||||
|  | ||||
| 	public boolean selected; | ||||
| 	 | ||||
| 	public String currentValue=""; | ||||
| 	 | ||||
| 	public ValueDisplay valueDisplay = ValueDisplay.DEFAULT; | ||||
| 	 | ||||
| 	public WaveDisplay waveDisplay = WaveDisplay.DEFAULT; | ||||
| 	 | ||||
| 	public TrackEntry(IWaveform waveform) { | ||||
| 		this.waveform = waveform; | ||||
| 		vOffset=0; | ||||
| 		height=0; | ||||
| 		selected=false; | ||||
| 		signalColors = new Color[2]; | ||||
| 		signalColors[0] = fallbackColor; | ||||
| 		signalColors[1] = highlightedFallbackColor; | ||||
| 	} | ||||
| 	 | ||||
| 	public boolean isStream(){ | ||||
| 		return waveform instanceof ITxStream<?>; | ||||
| 	} | ||||
|  | ||||
| 	public ITxStream<? extends ITxEvent> getStream(){ | ||||
| 		return (ITxStream<?>) waveform; | ||||
| 	} | ||||
|  | ||||
| 	public boolean isSignal(){ | ||||
| 		return waveform instanceof ISignal<?>; | ||||
| 	} | ||||
| 	 | ||||
| 	public ISignal<?> getSignal(){ | ||||
| 		return (ISignal<?>) waveform; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
|     public boolean equals(Object obj) { | ||||
| 		if(obj instanceof TrackEntry){ | ||||
| 			TrackEntry o = (TrackEntry) obj; | ||||
| 			return waveform==o.waveform && vOffset==o.vOffset; | ||||
| 		} | ||||
| 		return false; | ||||
| 	} | ||||
| } | ||||
| @@ -1,68 +0,0 @@ | ||||
| package com.minres.scviewer.database; | ||||
| public enum BitValue { | ||||
|     ZERO, | ||||
|     ONE, | ||||
|     X, | ||||
|     Z; | ||||
|  | ||||
|     private static final BitValue[] ORDINAL_TABLE = BitValue.values(); | ||||
|  | ||||
|     public static BitValue fromChar(char c) { | ||||
|         switch (c) { | ||||
|             case '0': | ||||
|                 return ZERO; | ||||
|             case '1': | ||||
|                 return ONE; | ||||
|             case 'x': | ||||
|             case 'X': | ||||
|                 return X; | ||||
|             case 'z': | ||||
|             case 'Z': | ||||
|                 return Z; | ||||
|             default: | ||||
|                 throw new NumberFormatException("unknown digit " + c); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public char toChar() { | ||||
|         switch (this) { | ||||
|             case ZERO: | ||||
|                 return '0'; | ||||
|             case ONE: | ||||
|                 return '1'; | ||||
|             case X: | ||||
|                 return 'x'; | ||||
|             case Z: | ||||
|                 return 'z'; | ||||
|         } | ||||
|  | ||||
|         return ' '; // Unreachable? | ||||
|     } | ||||
|  | ||||
|     public static BitValue fromInt(int i) { | ||||
|         if (i == 0) { | ||||
|             return ZERO; | ||||
|         } else { | ||||
|             return ONE; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public int toInt() { | ||||
|         return (this == ONE) ? 1 : 0; | ||||
|     } | ||||
|  | ||||
|     public static BitValue fromOrdinal(int ord) { | ||||
|         return ORDINAL_TABLE[ord]; | ||||
|     } | ||||
|  | ||||
|     public int compare(BitValue other) { | ||||
|         if (this == ONE && other == ZERO) { | ||||
|             return 1; | ||||
|         } else if (this == ZERO && other == ONE) { | ||||
|             return -1; | ||||
|         } else { | ||||
|             // Either these are equal, or there is an X and Z, which match everything. | ||||
|             return 0; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,170 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database; | ||||
|  | ||||
| public class BitVector { | ||||
|  | ||||
| 	private final int width; | ||||
| 	 | ||||
| 	private int[] packedValues; | ||||
| 	 | ||||
| 	public BitVector(int netWidth) { | ||||
| 		this.width=netWidth; | ||||
| 		packedValues = new int[(netWidth+15)/16]; | ||||
| 		for(int i=0; i<packedValues.length; i++) packedValues[i]=0; | ||||
| 	} | ||||
|  | ||||
| 	public void setValue(int i, BitValue value) { | ||||
| 		int bitIndex = i*2; | ||||
| 		int wordOffset = bitIndex >> 5; | ||||
| 		int bitOffset = bitIndex & 31; | ||||
| 		packedValues[wordOffset] &= ~(3 << bitOffset); | ||||
| 		packedValues[wordOffset] |= value.ordinal() << bitOffset; | ||||
| 	} | ||||
|  | ||||
| 	public char[] getValue() { | ||||
|         int bitOffset = 0; | ||||
|         int wordOffset = 0; | ||||
|         char[] res = new char[width]; | ||||
|         // Copy values out of packed array | ||||
|         for (int i = 0; i < width; i++) { | ||||
|             int currentWord = (packedValues[wordOffset] >> bitOffset)&3; | ||||
|         	res[width-i-1]=BitValue.fromInt(currentWord).toChar(); | ||||
|             bitOffset += 2; | ||||
|             if (bitOffset == 32) { | ||||
|                 wordOffset++; | ||||
|                 bitOffset = 0; | ||||
|             } | ||||
|         } | ||||
| 		return res; | ||||
| 	} | ||||
|  | ||||
| 	public void setValue(char[] value) { | ||||
| 		int bitIndex = width; | ||||
| 		int wordOffset = bitIndex >> 4; | ||||
| 		int bitOffset = (bitIndex * 2) % 32; | ||||
| 		for (int i = Math.min(value.length, width) - 1; i >= 0; i--) { | ||||
| 			packedValues[wordOffset] |= BitValue.fromChar(value[i]).ordinal() << bitOffset; | ||||
| 			bitOffset += 2; | ||||
| 			if (bitOffset == 32) { | ||||
| 				wordOffset++; | ||||
| 				bitOffset = 0; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	public int getWidth() { | ||||
| 		return width; | ||||
| 	} | ||||
|  | ||||
| 	public String toString(){ | ||||
| 		return new String(getValue()); | ||||
| 	} | ||||
| 	 | ||||
| 	public String toHexString(){ | ||||
| 		int resWidth=(width-1)/4+1; | ||||
| 		char[] value=getValue(); | ||||
| 		char[] res = new char[resWidth]; | ||||
| 		for(int i=resWidth-1; i>=0; i--){ | ||||
| 			int digit=0; | ||||
| 			for(int j=3; j>=0; j--){ | ||||
| 				if((4*i+j)>=value.length) continue; | ||||
| 				BitValue val = BitValue.fromChar(value[4*i+j]); | ||||
| 				switch(val) { | ||||
| 				case X: | ||||
| 				case Z: | ||||
| 					res[i]=val.toChar(); | ||||
| 					continue; | ||||
| 				case ONE: | ||||
| 					digit+=1<<(3-j); | ||||
| 					break; | ||||
| 				default: | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 			res[i]=Character.forDigit(digit, 16); //((digit < 10) ? '0' + digit : 'a' + digit -10) | ||||
| 		} | ||||
| 		return new String(res);		 | ||||
| 	} | ||||
| 	 | ||||
| 	public long toUnsignedValue() { | ||||
| 		long res = 0; | ||||
|         int bitOffset = 0; | ||||
|         int wordOffset = 0; | ||||
|         int currentWord = 0; | ||||
|         // Copy values out of packed array | ||||
|         for (int i = 0; i < width; i++) { | ||||
|             if(bitOffset==0) currentWord = packedValues[wordOffset]; | ||||
| 			switch (currentWord & 3) { | ||||
| 			case 1: | ||||
| 				res|=1<<i; | ||||
| 				break; | ||||
| 			case 2: | ||||
| 			case 3: | ||||
| 				return 0; | ||||
| 			default: | ||||
| 				break; | ||||
| 			} | ||||
|             bitOffset += 2; | ||||
|             if (bitOffset == 32) { | ||||
|                 wordOffset++; | ||||
|                 bitOffset = 0; | ||||
|             } else { | ||||
|                 currentWord >>= 2; | ||||
|             } | ||||
|         } | ||||
|         return res; | ||||
| 	} | ||||
| 	 | ||||
| 	public long toSignedValue() { | ||||
| 		long res = 0; | ||||
|         int bitOffset = 0; | ||||
|         int wordOffset = 0; | ||||
|         int currentWord = 0; | ||||
|         int lastVal=0; | ||||
|         // Copy values out of packed array | ||||
|         for (int i = 0; i < width; i++) { | ||||
|         	if(bitOffset==0) currentWord = packedValues[wordOffset]; | ||||
|         	lastVal=0; | ||||
| 			switch (currentWord & 3) { | ||||
| 			case 1: | ||||
| 				res|=1<<i; | ||||
| 				lastVal=1; | ||||
| 				break; | ||||
| 			case 2: | ||||
| 			case 3: | ||||
| 				return 0; | ||||
| 			default: | ||||
| 			} | ||||
|             bitOffset += 2; | ||||
|             if (bitOffset == 32) { | ||||
|                 wordOffset++; | ||||
|                 bitOffset = 0; | ||||
|             } else { | ||||
|                 currentWord >>= 2; | ||||
|             } | ||||
|         } | ||||
|         for(int i=width; i<64; i++) { | ||||
|         	if(bitOffset==0) currentWord = packedValues[wordOffset]; | ||||
|         	res|=lastVal<<i; | ||||
|         	bitOffset += 2; | ||||
|             if (bitOffset == 32) { | ||||
|                 wordOffset++; | ||||
|                 bitOffset = 0; | ||||
|             } else { | ||||
|                 currentWord >>= 2; | ||||
|             } | ||||
|         	 | ||||
|         } | ||||
| 		return res; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -1,28 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database; | ||||
|  | ||||
| public enum DataType { | ||||
| 	BOOLEAN, // bool | ||||
| 	ENUMERATION, // enum | ||||
| 	INTEGER, // char, short, int, long, long long, sc_int, sc_bigint | ||||
| 	UNSIGNED, // unsigned { char, short, int, long, long long }, sc_uint, | ||||
| 				// sc_biguint | ||||
| 	FLOATING_POINT_NUMBER, // float, double | ||||
| 	BIT_VECTOR, // sc_bit, sc_bv | ||||
| 	LOGIC_VECTOR, // sc_logic, sc_lv | ||||
| 	FIXED_POINT_INTEGER, // sc_fixed | ||||
| 	UNSIGNED_FIXED_POINT_INTEGER, // sc_ufixed | ||||
| 	RECORD, // struct/class | ||||
| 	POINTER, // T* | ||||
| 	ARRAY, // T[N] | ||||
| 	STRING // string, std::string | ||||
| }; | ||||
| @@ -1,87 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database; | ||||
|  | ||||
| import java.beans.PropertyChangeListener; | ||||
| import java.beans.PropertyChangeSupport; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
|  | ||||
| public class HierNode implements IHierNode { | ||||
|  | ||||
| 	protected String name; | ||||
| 	 | ||||
| 	protected String parentName; | ||||
| 	 | ||||
| 	protected ArrayList<IHierNode> childs; | ||||
| 	 | ||||
| 	protected PropertyChangeSupport pcs; | ||||
|  | ||||
| 	public HierNode() { | ||||
| 		childs = new ArrayList<IHierNode>(); | ||||
| 		pcs=new PropertyChangeSupport(this); | ||||
| 	} | ||||
|  | ||||
| 	public HierNode(String name) { | ||||
| 		this(name, ""); | ||||
| 	} | ||||
|  | ||||
| 	public HierNode(String name, String parentName) { | ||||
| 		this(); | ||||
| 		this.name=name; | ||||
| 		this.parentName=parentName; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public void addPropertyChangeListener(PropertyChangeListener l) { | ||||
| 		pcs.addPropertyChangeListener(l); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public void removePropertyChangeListener(PropertyChangeListener l) { | ||||
| 		pcs.removePropertyChangeListener(l); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	@Override | ||||
| 	public String getFullName() { | ||||
| 		if(parentName!=null && parentName.length()>0) | ||||
| 			return parentName+"."+name; | ||||
| 		else | ||||
| 			return name; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getName() { | ||||
| 		return name; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public void setName(String name) { | ||||
| 		this.name=name; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public void setParentName(String name) { | ||||
| 		this.parentName=name; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public List<IHierNode> getChildNodes() { | ||||
| 		return childs; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public int compareTo(IHierNode o) { | ||||
| 		return name.compareTo(o.getName()); | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -1,46 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database; | ||||
|  | ||||
| import java.beans.PropertyChangeListener; | ||||
| import java.util.List; | ||||
|  | ||||
| public interface IHierNode extends Comparable<IHierNode>{ | ||||
| 	 | ||||
| 	/** | ||||
| 	 * Attach a non-null PropertyChangeListener to this object. | ||||
| 	 *  | ||||
| 	 * @param l | ||||
| 	 *            a non-null PropertyChangeListener instance | ||||
| 	 * @throws IllegalArgumentException | ||||
| 	 *             if the parameter is null | ||||
| 	 */ | ||||
| 	public void addPropertyChangeListener(PropertyChangeListener l); | ||||
|  | ||||
| 	/** | ||||
| 	 * Remove a PropertyChangeListener from this component. | ||||
| 	 *  | ||||
| 	 * @param l | ||||
| 	 *            a PropertyChangeListener instance | ||||
| 	 */ | ||||
| 	public void removePropertyChangeListener(PropertyChangeListener l) ; | ||||
|  | ||||
| 	public String getFullName(); | ||||
| 	 | ||||
| 	public String getName(); | ||||
| 	 | ||||
| 	public void setName(String name); | ||||
| 	 | ||||
| 	public void setParentName(String name); | ||||
|  | ||||
| 	public List<IHierNode> getChildNodes(); | ||||
|  | ||||
| } | ||||
| @@ -1,35 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database; | ||||
|  | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
|  | ||||
| public interface ITx extends Comparable<ITx>{ | ||||
|  | ||||
| 	public Long getId(); | ||||
| 	 | ||||
| 	public ITxStream<ITxEvent> getStream(); | ||||
| 	 | ||||
| 	public ITxGenerator getGenerator(); | ||||
| 	 | ||||
| 	public Long getBeginTime(); | ||||
| 	 | ||||
| 	public Long getEndTime(); | ||||
| 	 | ||||
| 	public int getConcurrencyIndex(); | ||||
| 	 | ||||
| 	public List<ITxAttribute> getAttributes(); | ||||
| 	 | ||||
| 	public Collection<ITxRelation> getIncomingRelations(); | ||||
|  | ||||
| 	public Collection<ITxRelation> getOutgoingRelations(); | ||||
| } | ||||
| @@ -1,20 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| public interface ITxGenerator { | ||||
| 	public Long getId(); | ||||
| 	public ITxStream<ITxEvent> getStream(); | ||||
| 	public String getName(); | ||||
| 	public List<ITx> getTransactions(); | ||||
| } | ||||
| @@ -1,27 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database; | ||||
|  | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
| import java.util.NavigableMap; | ||||
|  | ||||
| public interface  ITxStream<T extends ITxEvent> extends IWaveform { | ||||
|  | ||||
| 	public List<ITxGenerator> getGenerators(); | ||||
|  | ||||
| 	public int getMaxConcurrency(); | ||||
|  | ||||
| 	public NavigableMap<Long, List<ITxEvent>> getEvents(); | ||||
|  | ||||
| 	public Collection<T> getWaveformEventsAtTime(Long time); | ||||
|  | ||||
| } | ||||
| @@ -1,27 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
|  | ||||
| public interface IWaveformDbLoader { | ||||
| 	 | ||||
| 	public boolean load(IWaveformDb db, File inp) throws Exception; | ||||
| 	 | ||||
| 	public Long getMaxTime(); | ||||
| 	 | ||||
| 	public List<IWaveform> getAllWaves() ; | ||||
| 	 | ||||
| 	public Collection<RelationType> getAllRelationTypes() ; | ||||
| 	 | ||||
| } | ||||
| @@ -1,189 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.internal; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.Collections; | ||||
| import java.util.HashMap; | ||||
| import java.util.Iterator; | ||||
| import java.util.LinkedList; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
|  | ||||
| import com.minres.scviewer.database.HierNode; | ||||
| import com.minres.scviewer.database.IHierNode; | ||||
| import com.minres.scviewer.database.IWaveform; | ||||
| import com.minres.scviewer.database.IWaveformDb; | ||||
| import com.minres.scviewer.database.IWaveformDbLoader; | ||||
| import com.minres.scviewer.database.InputFormatException; | ||||
| import com.minres.scviewer.database.RelationType; | ||||
|  | ||||
| public class WaveformDb extends HierNode implements IWaveformDb { | ||||
|  | ||||
| 	private static List<IWaveformDbLoader> loaders=new LinkedList<IWaveformDbLoader>(); | ||||
|  | ||||
| 	private boolean loaded; | ||||
|  | ||||
| 	private List<IHierNode> childNodes; | ||||
|  | ||||
| 	private List<RelationType> relationTypes; | ||||
| 	 | ||||
| 	private Map<String, IWaveform> waveforms; | ||||
|  | ||||
| 	private Long maxTime; | ||||
| 	 | ||||
| 	 | ||||
| 	public synchronized void bind(IWaveformDbLoader loader){ | ||||
| 		loaders.add(loader); | ||||
| 	} | ||||
|  | ||||
| 	public synchronized void unbind(IWaveformDbLoader loader){ | ||||
| 		loaders.remove(loader); | ||||
| 	} | ||||
|  | ||||
| 	 | ||||
| 	public static List<IWaveformDbLoader> getLoaders() { | ||||
| 		return Collections.unmodifiableList(loaders); | ||||
| 	} | ||||
|  | ||||
| 	public WaveformDb() { | ||||
| 		super(); | ||||
| 		waveforms = new HashMap<String, IWaveform>(); | ||||
| 		relationTypes=new ArrayList<>(); | ||||
| 		maxTime=0L; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getMaxTime() { | ||||
| 		return maxTime; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public IWaveform getStreamByName(String name) { | ||||
| 		return waveforms.get(name); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public List<IWaveform> getAllWaves() { | ||||
| 		return new ArrayList<IWaveform>(waveforms.values()); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public boolean load(File inp){ | ||||
| 		for(IWaveformDbLoader loader:loaders){ | ||||
| 			try { | ||||
| 				if(loader.load(this, inp)){ | ||||
| 					for(IWaveform w:loader.getAllWaves()){ | ||||
| 						waveforms.put(w.getFullName(),w); | ||||
| 					} | ||||
| 					if(loader.getMaxTime()>maxTime){ | ||||
| 						maxTime=loader.getMaxTime(); | ||||
| 					} | ||||
| 					if(name==null) name=getFileBasename(inp.getName()); | ||||
| 					buildHierarchyNodes() ; | ||||
| 					relationTypes.addAll(loader.getAllRelationTypes()); | ||||
| 					pcs.firePropertyChange("WAVEFORMS", null, waveforms); | ||||
| 					pcs.firePropertyChange("CHILDS", null, childNodes); | ||||
| 					loaded = true; | ||||
| 					return true; | ||||
| 				} | ||||
| 			} catch (Exception e) { | ||||
| 				return false; | ||||
| 			} | ||||
| 		}		 | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	protected static String getFileBasename(String f) { | ||||
| 	    String ext = ""; | ||||
| 	    int i = f.lastIndexOf('.'); | ||||
| 	    if (i > 0 &&  i < f.length() - 1) { | ||||
| 	      ext = f.substring(0, i); | ||||
| 	    } | ||||
| 	    return ext; | ||||
| 	  } | ||||
|  | ||||
| 	@Override | ||||
| 	public void clear() { | ||||
| 		waveforms.clear(); | ||||
| 		childNodes.clear(); | ||||
| 		loaded=false; | ||||
| 	} | ||||
|  | ||||
| 	public boolean isLoaded() { | ||||
| 		return loaded; | ||||
| 	} | ||||
|  | ||||
| 	private void buildHierarchyNodes() throws InputFormatException{ | ||||
| 		childNodes= new ArrayList<IHierNode>(); | ||||
| 		for(IWaveform stream:getAllWaves()){ | ||||
| 			//updateMaxTime(stream); | ||||
| 			String[] hier = stream.getName().split("\\."); | ||||
| 			IHierNode node = this; | ||||
| 			List<String> path=new LinkedList<String>(); | ||||
| 			path.add(name); | ||||
| 			for(String name:hier){ | ||||
| 				IHierNode n1 = null; | ||||
| 				for (IHierNode n : node.getChildNodes()) { | ||||
| 					if (n.getName().equals(name)) { | ||||
| 						n1=n; | ||||
| 						break; | ||||
| 					} | ||||
| 				} | ||||
| 				if(name.equals(hier[hier.length-1])){ //leaf | ||||
| 					if(n1!=null) { | ||||
| 						if(n1 instanceof HierNode){ | ||||
| 							node.getChildNodes().remove(n1); | ||||
| 							stream.getChildNodes().addAll(n1.getChildNodes()); | ||||
| 							Collections.sort(stream.getChildNodes()); | ||||
| 						} else { | ||||
| 							throw new InputFormatException(); | ||||
| 						} | ||||
| 					} | ||||
| 					stream.setName(name); | ||||
| 					stream.setParentName(join(path, ".")); | ||||
| 					node.getChildNodes().add(stream); | ||||
| 					Collections.sort(node.getChildNodes()); | ||||
| 					node=stream; | ||||
| 				} else { // intermediate | ||||
| 					if(n1 != null) { | ||||
| 						node=n1; | ||||
| 					} else { | ||||
| 						HierNode newNode = new HierNode(name, join(path, ".")); | ||||
| 						node.getChildNodes().add(newNode); | ||||
| 						Collections.sort(node.getChildNodes()); | ||||
| 						node=newNode; | ||||
| 					} | ||||
| 				} | ||||
| 				path.add(name); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	private static String join(Collection<?> col, String delim) { | ||||
| 	    StringBuilder sb = new StringBuilder(); | ||||
| 	    Iterator<?> iter = col.iterator(); | ||||
| 	    if (iter.hasNext()) | ||||
| 	        sb.append(iter.next().toString()); | ||||
| 	    while (iter.hasNext()) { | ||||
| 	        sb.append(delim); | ||||
| 	        sb.append(iter.next().toString()); | ||||
| 	    } | ||||
| 	    return sb.toString(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public List<RelationType> getAllRelationTypes() { | ||||
| 		return relationTypes; | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| eclipse.preferences.version=1 | ||||
| pluginProject.extensions=false | ||||
| resolve.requirebundle=false | ||||
| @@ -1,38 +0,0 @@ | ||||
| Manifest-Version: 1.0 | ||||
| Bundle-ManifestVersion: 2 | ||||
| Bundle-Name: %Bundle-Name | ||||
| Bundle-SymbolicName: com.minres.scviewer.e4.application;singleton:=true | ||||
| Bundle-Version: 2.2.0.qualifier | ||||
| Bundle-Vendor: %Bundle-Vendor | ||||
| Require-Bundle: javax.inject;bundle-version="1.0.0", | ||||
|   org.eclipse.core.runtime;bundle-version="3.11.1", | ||||
|   org.eclipse.swt;bundle-version="3.104.1", | ||||
|   org.eclipse.e4.ui.model.workbench;bundle-version="1.1.100", | ||||
|   org.eclipse.jface;bundle-version="3.11.0", | ||||
|   org.eclipse.e4.ui.services;bundle-version="1.2.0", | ||||
|   org.eclipse.e4.ui.workbench;bundle-version="1.3.0", | ||||
|   org.eclipse.e4.core.di;bundle-version="1.5.0", | ||||
|   org.eclipse.e4.ui.di;bundle-version="1.1.0", | ||||
|   org.eclipse.e4.core.contexts;bundle-version="1.4.0", | ||||
|   com.minres.scviewer.database.ui.swt;bundle-version="1.0.0", | ||||
|   com.minres.scviewer.database.ui, | ||||
|   com.minres.scviewer.database;bundle-version="1.0.0", | ||||
|   org.eclipse.equinox.ds;bundle-version="1.4.300", | ||||
|   org.eclipse.equinox.util;bundle-version="1.0.500", | ||||
|   org.eclipse.osgi.services;bundle-version="3.5.0", | ||||
|   org.eclipse.e4.core.services;bundle-version="2.0.0", | ||||
|   org.eclipse.osgi.services;bundle-version="3.5.0", | ||||
|   org.eclipse.core.jobs, | ||||
|   org.eclipse.osgi, | ||||
|   com.google.guava, | ||||
|   org.eclipse.equinox.preferences, | ||||
|   org.eclipse.core.expressions, | ||||
|   org.eclipse.e4.core.commands;bundle-version="0.11.0", | ||||
|   org.eclipse.e4.ui.workbench.addons.swt, | ||||
|   com.opcoach.e4.preferences, | ||||
|   org.eclipse.e4.core.di.extensions, | ||||
|   org.eclipse.e4.ui.css.swt.theme;bundle-version="0.10.0" | ||||
| Bundle-RequiredExecutionEnvironment: JavaSE-1.8 | ||||
| Import-Package: com.minres.scviewer.database, | ||||
|   javax.inject;version="1.0.0" | ||||
| Automatic-Module-Name: com.minres.scviewer.e4.application | ||||
| @@ -1,12 +0,0 @@ | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|   <modelVersion>4.0.0</modelVersion> | ||||
|   <artifactId>com.minres.scviewer.e4.application</artifactId> | ||||
|   <version>2.2.0-SNAPSHOT</version> | ||||
|   <parent> | ||||
|   	<groupId>com.minres.scviewer</groupId> | ||||
|   	<artifactId>com.minres.scviewer.parent</artifactId> | ||||
|   	<version>2.0.0-SNAPSHOT</version> | ||||
|   	<relativePath>../com.minres.scviewer.parent</relativePath> | ||||
|   </parent> | ||||
|   <packaging>eclipse-plugin</packaging> | ||||
|   </project> | ||||
| @@ -1,178 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.e4.application; | ||||
|  | ||||
| import java.io.File; | ||||
|  | ||||
| import javax.annotation.PostConstruct; | ||||
| import javax.inject.Inject; | ||||
|  | ||||
| import org.eclipse.e4.core.contexts.ContextInjectionFactory; | ||||
| import org.eclipse.e4.core.contexts.IEclipseContext; | ||||
| import org.eclipse.e4.core.services.events.IEventBroker; | ||||
| import org.eclipse.e4.ui.model.application.MApplication; | ||||
| import org.eclipse.e4.ui.model.application.ui.basic.MPart; | ||||
| import org.eclipse.e4.ui.model.application.ui.basic.MPartStack; | ||||
| import org.eclipse.e4.ui.workbench.UIEvents; | ||||
| import org.eclipse.e4.ui.workbench.lifecycle.PostContextCreate; | ||||
| import org.eclipse.e4.ui.workbench.lifecycle.PreSave; | ||||
| import org.eclipse.e4.ui.workbench.lifecycle.ProcessAdditions; | ||||
| import org.eclipse.e4.ui.workbench.lifecycle.ProcessRemovals; | ||||
| import org.eclipse.e4.ui.workbench.modeling.EModelService; | ||||
| import org.eclipse.e4.ui.workbench.modeling.EPartService; | ||||
| import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState; | ||||
| import org.eclipse.equinox.app.IApplicationContext; | ||||
| import org.osgi.service.event.Event; | ||||
| import org.osgi.service.event.EventHandler; | ||||
|  | ||||
| import com.minres.scviewer.e4.application.options.Options; | ||||
| import com.minres.scviewer.e4.application.options.Options.Multiplicity; | ||||
| import com.minres.scviewer.e4.application.options.Options.Separator; | ||||
|  | ||||
| /** | ||||
|  * This implementation contains e4 LifeCycle annotated methods.<br /> | ||||
|  * There is a corresponding entry in <em>plugin.xml</em> (under the | ||||
|  * <em>org.eclipse.core.runtime.products' extension point</em>) that references | ||||
|  * this class. | ||||
|  **/ | ||||
| @SuppressWarnings("restriction") | ||||
| public class E4LifeCycle { | ||||
|  | ||||
| 	/** | ||||
| 	 * Post construct. | ||||
| 	 * | ||||
| 	 * @param eventBroker the event broker | ||||
| 	 */ | ||||
| 	@PostConstruct | ||||
| 	private static void postConstruct(final IEventBroker eventBroker) { | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Post context create.  Open a database if given on command line using the OpenViewHandler | ||||
| 	 * | ||||
| 	 * @param appContext the app context | ||||
| 	 * @param eventBroker the event broker | ||||
| 	 */ | ||||
| 	@PostContextCreate | ||||
| 	void postContextCreate(IApplicationContext appContext, final IEventBroker eventBroker) { | ||||
| 		final String[] args = (String[])appContext.getArguments().get(IApplicationContext.APPLICATION_ARGS); | ||||
| 		Options opt = new Options(args, 0, 1); | ||||
| 		opt.getSet() | ||||
| 			.addOption("clearPersistedState", Multiplicity.ZERO_OR_ONE) | ||||
| 			.addOption("c", Separator.BLANK, Multiplicity.ZERO_OR_ONE); | ||||
| 		if (!opt.check(Options.DEFAULT_SET, true, false)) { | ||||
| 			System.err.println(opt.getCheckErrors()); | ||||
| 			System.exit(1); | ||||
| 		} | ||||
| 		final String confFile =opt.getSet().isSet("c")?opt.getSet().getOption("c").getResultValue(0):""; | ||||
|  | ||||
| 		// react on the first view being created, at that time the UI is available | ||||
| 		eventBroker.subscribe(UIEvents.UILifeCycle.ACTIVATE, new EventHandler() { | ||||
| 			@Override | ||||
| 			public void handleEvent(Event event) { | ||||
| 				MPart part = (MPart) event.getProperty("ChangedElement"); //$NON-NLS-1$ | ||||
| 				if(part!=null){ | ||||
| 					IEclipseContext ctx = part.getContext(); | ||||
| 					OpenViewHandler openViewHandler= new OpenViewHandler(); | ||||
| 					if(confFile.length()>0) openViewHandler.setConfigFile(confFile); | ||||
| 					ContextInjectionFactory.inject(openViewHandler, ctx); | ||||
| 					eventBroker.unsubscribe(this); | ||||
| 					for(String name:opt.getSet().getData()){ | ||||
| 						if(new File(name).exists())	openViewHandler.openViewForFile(name); | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		}); | ||||
| 	} | ||||
| 	 | ||||
| 	/** | ||||
| 	 * Pre save. | ||||
| 	 * | ||||
| 	 * @param workbenchContext the workbench context | ||||
| 	 */ | ||||
| 	@PreSave | ||||
| 	void preSave(IEclipseContext workbenchContext) { | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Process additions. | ||||
| 	 * | ||||
| 	 * @param workbenchContext the workbench context | ||||
| 	 */ | ||||
| 	@ProcessAdditions | ||||
| 	void processAdditions(IEclipseContext workbenchContext) { | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Process removals. | ||||
| 	 * | ||||
| 	 * @param workbenchContext the workbench context | ||||
| 	 */ | ||||
| 	@ProcessRemovals | ||||
| 	void processRemovals(IEclipseContext workbenchContext) { | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Join. | ||||
| 	 * | ||||
| 	 * @param tokens the tokens | ||||
| 	 * @return the string | ||||
| 	 */ | ||||
| 	String join(String[] tokens){ | ||||
| 		StringBuilder sb = new StringBuilder(); | ||||
| 		boolean first=true; | ||||
| 		for(String token:tokens){ | ||||
| 			if(!first) sb.append(","); //$NON-NLS-1$ | ||||
| 			sb.append(token); | ||||
| 			first=false; | ||||
| 		} | ||||
| 		return sb.toString(); | ||||
| 	} | ||||
| 	 | ||||
| 	/** | ||||
| 	 * The Class OpenViewHandler. | ||||
| 	 */ | ||||
| 	private class OpenViewHandler { | ||||
| 		 | ||||
| 		/** The app. */ | ||||
| 		@Inject MApplication app; | ||||
| 		 | ||||
| 		/** The model service. */ | ||||
| 		@Inject EModelService modelService; | ||||
| 		 | ||||
| 		/** The part service. */ | ||||
| 		@Inject EPartService partService; | ||||
| 		 | ||||
| 		String confFile=""; | ||||
| 		/** | ||||
| 		 * Open view for file. | ||||
| 		 * | ||||
| 		 * @param name the name | ||||
| 		 */ | ||||
| 		public void openViewForFile(String name){ | ||||
| 			File file = new File(name); | ||||
| 			MPart part = partService.createPart("com.minres.scviewer.e4.application.partdescriptor.waveformviewer"); //$NON-NLS-1$ | ||||
| 			part.setLabel(file.getName()); | ||||
| 			MPartStack partStack = (MPartStack)modelService.find("org.eclipse.editorss", app); //$NON-NLS-1$ | ||||
| 			partStack.getChildren().add(part); | ||||
| 			partService.showPart(part, PartState.ACTIVATE); | ||||
| 			IEclipseContext ctx=part.getContext(); | ||||
| 			ctx.modify("input", file); //$NON-NLS-1$ | ||||
| 			//ctx.declareModifiable("input"); //$NON-NLS-1$ | ||||
| 			ctx.modify("config", confFile); //$NON-NLS-1$ | ||||
| 			//ctx.declareModifiable("config"); //$NON-NLS-1$				 | ||||
| 		} | ||||
|  | ||||
| 		public void setConfigFile(String confFile) { | ||||
| 			this.confFile=confFile; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,779 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.e4.application.internal.status; | ||||
| import java.lang.reflect.Method; | ||||
|  | ||||
| import org.eclipse.core.runtime.preferences.IEclipsePreferences; | ||||
| import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener; | ||||
| import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent; | ||||
| import org.eclipse.jface.action.Action; | ||||
| import org.eclipse.jface.action.IAction; | ||||
| import org.eclipse.jface.action.IMenuListener; | ||||
| import org.eclipse.jface.action.IMenuManager; | ||||
| import org.eclipse.jface.action.MenuManager; | ||||
| import org.eclipse.jface.resource.ImageDescriptor; | ||||
| import org.eclipse.swt.SWT; | ||||
| import org.eclipse.swt.graphics.Color; | ||||
| import org.eclipse.swt.graphics.GC; | ||||
| import org.eclipse.swt.graphics.Image; | ||||
| import org.eclipse.swt.graphics.Point; | ||||
| import org.eclipse.swt.graphics.Rectangle; | ||||
| import org.eclipse.swt.widgets.Canvas; | ||||
| import org.eclipse.swt.widgets.Composite; | ||||
| import org.eclipse.swt.widgets.Display; | ||||
| import org.eclipse.swt.widgets.Event; | ||||
| import org.eclipse.swt.widgets.Listener; | ||||
| import org.eclipse.swt.widgets.Menu; | ||||
| import org.eclipse.wb.swt.ResourceManager; | ||||
| import org.eclipse.wb.swt.SWTResourceManager; | ||||
| import org.osgi.service.prefs.Preferences; | ||||
|  | ||||
| /** | ||||
|  * The Heap Status control, which shows the heap usage statistics in the window trim. | ||||
|  * Part of the code is taken from the eclipse internal implementation | ||||
|  */ | ||||
| public class HeapStatus extends Composite { | ||||
|  | ||||
| 	/** The armed. */ | ||||
| 	private boolean armed; | ||||
| 	 | ||||
| 	/** The gc image. */ | ||||
| 	private Image gcImage; | ||||
| 	 | ||||
| 	/** The disabled gc image. */ | ||||
| 	private Image disabledGcImage; | ||||
| 	 | ||||
| 	/** The arm col. */ | ||||
| 	private Color bgCol, usedMemCol, lowMemCol, freeMemCol, topLeftCol, bottomRightCol, sepCol, textCol, markCol, armCol; | ||||
|      | ||||
|     /** The button. */ | ||||
|     private Canvas button; | ||||
| 	 | ||||
| 	/** The preferences. */ | ||||
| 	private Preferences preferences; | ||||
| 	 | ||||
| 	/** The update interval. */ | ||||
| 	private int updateInterval; | ||||
| 	 | ||||
| 	/** The show max. */ | ||||
| 	private boolean showMax; | ||||
|      | ||||
|     /** The total mem. */ | ||||
|     private long totalMem; | ||||
|      | ||||
|     /** The prev total mem. */ | ||||
|     private long prevTotalMem = -1L; | ||||
|      | ||||
|     /** The prev used mem. */ | ||||
|     private long prevUsedMem = -1L; | ||||
|      | ||||
|     /** The has changed. */ | ||||
|     private boolean hasChanged; | ||||
|      | ||||
|     /** The used mem. */ | ||||
|     private long usedMem; | ||||
|      | ||||
|     /** The mark. */ | ||||
|     private long mark = -1; | ||||
|      | ||||
|     /** The img bounds. */ | ||||
|     // start with 12x12 | ||||
| 	private Rectangle imgBounds = new Rectangle(0,0,12,12); | ||||
| 	 | ||||
| 	/** The max mem. */ | ||||
| 	private long maxMem = Long.MAX_VALUE; | ||||
| 	 | ||||
| 	/** The max mem known. */ | ||||
| 	private boolean maxMemKnown; | ||||
| 	 | ||||
| 	/** The low mem threshold. */ | ||||
| 	private float lowMemThreshold = 0.05f; | ||||
| 	 | ||||
| 	/** The show low mem threshold. */ | ||||
| 	private boolean showLowMemThreshold = true; | ||||
| 	 | ||||
| 	/** The update tooltip. */ | ||||
| 	private boolean updateTooltip = false; | ||||
|  | ||||
| 	/** The is in gc. */ | ||||
| 	protected volatile boolean isInGC = false; | ||||
|  | ||||
|     /** The timer. */ | ||||
|     private final Runnable timer = new Runnable() { | ||||
|         @Override | ||||
| 		public void run() { | ||||
|             if (!isDisposed()) { | ||||
|                 updateStats(); | ||||
|                 if (hasChanged) { | ||||
|                 	if (updateTooltip) { | ||||
|                 		updateToolTip(); | ||||
|                 	} | ||||
|                     redraw(); | ||||
|                     hasChanged = false; | ||||
|                 } | ||||
|                 getDisplay().timerExec(updateInterval, this); | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     /** The pref listener. */ | ||||
|     private final IPreferenceChangeListener prefListener = new IPreferenceChangeListener() { | ||||
| 		@Override | ||||
| 		public void preferenceChange(PreferenceChangeEvent event) { | ||||
| 			if (IHeapStatusConstants.PREF_UPDATE_INTERVAL.equals(event.getKey())) { | ||||
| 				setUpdateIntervalInMS(preferences.getInt(IHeapStatusConstants.PREF_UPDATE_INTERVAL, 100)); | ||||
| 			} | ||||
| 			else if (IHeapStatusConstants.PREF_SHOW_MAX.equals(event.getKey())) { | ||||
| 				showMax = preferences.getBoolean(IHeapStatusConstants.PREF_SHOW_MAX, true); | ||||
| 			} | ||||
| 			 | ||||
| 		} | ||||
| 	}; | ||||
|  | ||||
|     /** | ||||
|      * Creates a new heap status control with the given parent, and using | ||||
|      * the given preference store to obtain settings such as the refresh | ||||
|      * interval. | ||||
|      * | ||||
|      * @param parent the parent composite | ||||
|      * @param preferences the preference store | ||||
|      */ | ||||
| 	public HeapStatus(Composite parent, Preferences preferences) { | ||||
| 		super(parent, SWT.NONE); | ||||
|  | ||||
| 		maxMem = getMaxMem(); | ||||
| 		maxMemKnown = maxMem != Long.MAX_VALUE; | ||||
|  | ||||
|         this.preferences = preferences; | ||||
|         if(this.preferences instanceof IEclipsePreferences) | ||||
|         	((IEclipsePreferences)this.preferences).addPreferenceChangeListener(prefListener); | ||||
|  | ||||
|         setUpdateIntervalInMS(preferences.getInt(IHeapStatusConstants.PREF_UPDATE_INTERVAL, 100)); | ||||
|         showMax = preferences.getBoolean(IHeapStatusConstants.PREF_SHOW_MAX, true); | ||||
|  | ||||
|         button = new Canvas(this, SWT.NONE); | ||||
|         button.setToolTipText("Run Garbage Collection"); | ||||
|  | ||||
| 		ImageDescriptor imageDesc = ResourceManager.getPluginImageDescriptor("com.minres.scviewer.e4.application", "icons/trash.png"); //$NON-NLS-1$ | ||||
| 		Display display = getDisplay(); | ||||
| 		gcImage = imageDesc.createImage(); | ||||
| 		if (gcImage != null) { | ||||
| 			imgBounds = gcImage.getBounds(); | ||||
| 			disabledGcImage = new Image(display, gcImage, SWT.IMAGE_DISABLE); | ||||
| 		} | ||||
| 		usedMemCol = display.getSystemColor(SWT.COLOR_INFO_BACKGROUND); | ||||
| 		lowMemCol = SWTResourceManager.getColor(255, 70, 70);  // medium red | ||||
| 		freeMemCol = SWTResourceManager.getColor(255, 190, 125);  // light orange | ||||
| 		bgCol = SWTResourceManager.getColor(SWT.COLOR_WIDGET_BACKGROUND); | ||||
| 		sepCol = topLeftCol = armCol = SWTResourceManager.getColor(SWT.COLOR_WIDGET_NORMAL_SHADOW); | ||||
| 		bottomRightCol = SWTResourceManager.getColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW); | ||||
| 		markCol = textCol = SWTResourceManager.getColor(SWT.COLOR_INFO_FOREGROUND); | ||||
|  | ||||
| 		createContextMenu(); | ||||
|  | ||||
|         Listener listener = new Listener() { | ||||
|  | ||||
|             @Override | ||||
| 			public void handleEvent(Event event) { | ||||
|                 switch (event.type) { | ||||
|                 case SWT.Dispose: | ||||
|                 	doDispose(); | ||||
|                     break; | ||||
|                 case SWT.Resize: | ||||
|                     Rectangle rect = getClientArea(); | ||||
|                     button.setBounds(rect.width - imgBounds.width - 1, 1, imgBounds.width, rect.height - 2); | ||||
|                     break; | ||||
|                 case SWT.Paint: | ||||
|                     if (event.widget == HeapStatus.this) { | ||||
|                     	paintComposite(event.gc); | ||||
|                     } | ||||
|                     else if (event.widget == button) { | ||||
|                         paintButton(event.gc); | ||||
|                     } | ||||
|                     break; | ||||
|                 case SWT.MouseUp: | ||||
|                     if (event.button == 1) { | ||||
| 						if (!isInGC) { | ||||
| 							arm(false); | ||||
| 							gc(); | ||||
| 						} | ||||
|                     } | ||||
|                     break; | ||||
|                 case SWT.MouseDown: | ||||
|                     if (event.button == 1) { | ||||
| 	                    if (event.widget == HeapStatus.this) { | ||||
| 							setMark(); | ||||
| 						} else if (event.widget == button) { | ||||
| 							if (!isInGC) | ||||
| 								arm(true); | ||||
| 						} | ||||
|                     } | ||||
|                     break; | ||||
|                 case SWT.MouseEnter: | ||||
|                 	HeapStatus.this.updateTooltip = true; | ||||
|                 	updateToolTip(); | ||||
|                 	break; | ||||
|                 case SWT.MouseExit: | ||||
|                     if (event.widget == HeapStatus.this) { | ||||
|                     	HeapStatus.this.updateTooltip = false; | ||||
| 					} else if (event.widget == button) { | ||||
| 						arm(false); | ||||
| 					} | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|         }; | ||||
|         addListener(SWT.Dispose, listener); | ||||
|         addListener(SWT.MouseDown, listener); | ||||
|         addListener(SWT.Paint, listener); | ||||
|         addListener(SWT.Resize, listener); | ||||
|         addListener(SWT.MouseEnter, listener); | ||||
|         addListener(SWT.MouseExit, listener); | ||||
|         button.addListener(SWT.MouseDown, listener); | ||||
|         button.addListener(SWT.MouseExit, listener); | ||||
|         button.addListener(SWT.MouseUp, listener); | ||||
|         button.addListener(SWT.Paint, listener); | ||||
|  | ||||
| 		// make sure stats are updated before first paint | ||||
| 		updateStats(); | ||||
|  | ||||
|         getDisplay().asyncExec(new Runnable() { | ||||
| 			@Override | ||||
| 			public void run() { | ||||
| 				if (!isDisposed()) { | ||||
| 					getDisplay().timerExec(updateInterval, timer); | ||||
| 				} | ||||
| 			} | ||||
| 		}); | ||||
|    	} | ||||
|  | ||||
| 	/* (non-Javadoc) | ||||
| 	 * @see org.eclipse.swt.widgets.Control#setBackground(org.eclipse.swt.graphics.Color) | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public void setBackground(Color color) { | ||||
| 		bgCol = color; | ||||
| 		button.redraw(); | ||||
| 		button.update(); | ||||
| 	} | ||||
|  | ||||
| 	/* (non-Javadoc) | ||||
| 	 * @see org.eclipse.swt.widgets.Control#setForeground(org.eclipse.swt.graphics.Color) | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public void setForeground(Color color) { | ||||
| 		if (color == null) { | ||||
| 			usedMemCol = getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND); | ||||
| 		} else { | ||||
| 			usedMemCol = color; | ||||
| 		} | ||||
|  | ||||
| 		button.redraw(); | ||||
| 		button.update(); | ||||
| 	} | ||||
|  | ||||
| 	/* (non-Javadoc) | ||||
| 	 * @see org.eclipse.swt.widgets.Control#getForeground() | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public Color getForeground() { | ||||
| 		if (usedMemCol != null) { | ||||
| 			return usedMemCol; | ||||
| 		} | ||||
| 		return getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns the maximum memory limit, or Long.MAX_VALUE if the max is not known. | ||||
| 	 * | ||||
| 	 * @return the max mem | ||||
| 	 */ | ||||
| 	private long getMaxMem() { | ||||
| 		long max = Long.MAX_VALUE; | ||||
| 		try { | ||||
| 			// Must use reflect to allow compilation against JCL/Foundation | ||||
| 			Method maxMemMethod = Runtime.class.getMethod("maxMemory", new Class[0]); //$NON-NLS-1$ | ||||
| 			Object o = maxMemMethod.invoke(Runtime.getRuntime(), new Object[0]); | ||||
| 			if (o instanceof Long) { | ||||
| 				max = ((Long) o).longValue(); | ||||
| 			} | ||||
| 		} | ||||
| 		catch (Exception e) { | ||||
| 			// ignore if method missing or if there are other failures trying to determine the max | ||||
| 		} | ||||
| 		return max; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Sets the update interval in ms. | ||||
| 	 * | ||||
| 	 * @param interval the new update interval in ms | ||||
| 	 */ | ||||
| 	private void setUpdateIntervalInMS(int interval) { | ||||
| 		updateInterval = Math.max(100, interval); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Do dispose. | ||||
| 	 */ | ||||
| 	private void doDispose() { | ||||
| 		if(preferences instanceof IEclipsePreferences) | ||||
|         	((IEclipsePreferences)preferences).removePreferenceChangeListener(prefListener); | ||||
|     	if (gcImage != null) { | ||||
| 			gcImage.dispose(); | ||||
| 		} | ||||
| 		if (disabledGcImage != null) { | ||||
| 			disabledGcImage.dispose(); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* (non-Javadoc) | ||||
| 	 * @see org.eclipse.swt.widgets.Composite#computeSize(int, int, boolean) | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public Point computeSize(int wHint, int hHint, boolean changed) { | ||||
|         GC gc = new GC(this); | ||||
|         Point p = gc.textExtent("MMMMMMMMMMMM"); | ||||
|         int height = imgBounds.height; | ||||
|         // choose the largest of | ||||
|         // 	- Text height + margins | ||||
|         //	- Image height + margins | ||||
|         //	- Default Trim heightin | ||||
|         height = Math.max(height, p.y) + 4; | ||||
|         height = Math.max(TrimUtil.TRIM_DEFAULT_HEIGHT, height); | ||||
|         gc.dispose(); | ||||
| 		return new Point(p.x + 15, height); | ||||
| 	} | ||||
|  | ||||
|     /** | ||||
|      * Arm. | ||||
|      * | ||||
|      * @param armed the armed | ||||
|      */ | ||||
|     private void arm(boolean armed) { | ||||
|         if (this.armed == armed) { | ||||
| 			return; | ||||
| 		} | ||||
|         this.armed = armed; | ||||
|         button.redraw(); | ||||
|         button.update(); | ||||
|     } | ||||
|  | ||||
| 	/** | ||||
| 	 * Gc running. | ||||
| 	 * | ||||
| 	 * @param isInGC the is in gc | ||||
| 	 */ | ||||
| 	private void gcRunning(boolean isInGC) { | ||||
| 		if (this.isInGC == isInGC) { | ||||
| 			return; | ||||
| 		} | ||||
| 		this.isInGC = isInGC; | ||||
| 		 button.redraw(); | ||||
| 		 button.update(); | ||||
| 	} | ||||
|  | ||||
|     /** | ||||
|      * Creates the context menu. | ||||
|      */ | ||||
|     private void createContextMenu() { | ||||
|         MenuManager menuMgr = new MenuManager(); | ||||
|         menuMgr.setRemoveAllWhenShown(true); | ||||
|         menuMgr.addMenuListener(new IMenuListener() { | ||||
| 			@Override | ||||
| 			public void menuAboutToShow(IMenuManager menuMgr) { | ||||
| 				fillMenu(menuMgr); | ||||
| 			} | ||||
| 		}); | ||||
|         Menu menu = menuMgr.createContextMenu(this); | ||||
|         setMenu(menu); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Fill menu. | ||||
|      * | ||||
|      * @param menuMgr the menu mgr | ||||
|      */ | ||||
|     private void fillMenu(IMenuManager menuMgr) { | ||||
|         menuMgr.add(new SetMarkAction()); | ||||
|         menuMgr.add(new ClearMarkAction()); | ||||
|         menuMgr.add(new ShowMaxAction()); | ||||
|         menuMgr.add(new CloseHeapStatusAction()); | ||||
| //        if (isKyrsoftViewAvailable()) { | ||||
| //        	menuMgr.add(new ShowKyrsoftViewAction()); | ||||
| //        } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the mark to the current usedMem level. | ||||
|      */ | ||||
|     private void setMark() { | ||||
|     	updateStats();  // get up-to-date stats before taking the mark | ||||
|         mark = usedMem; | ||||
|         hasChanged = true; | ||||
|         redraw(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Clears the mark. | ||||
|      */ | ||||
|     private void clearMark() { | ||||
|         mark = -1; | ||||
|         hasChanged = true; | ||||
|         redraw(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Gc. | ||||
|      */ | ||||
|     private void gc() { | ||||
| 		gcRunning(true); | ||||
| 		Thread t = new Thread() { | ||||
| 			@Override | ||||
| 			public void run() { | ||||
| 				busyGC(); | ||||
| 				getDisplay().asyncExec(new Runnable() { | ||||
| 					@Override | ||||
| 					public void run() { | ||||
| 						if (!isDisposed()) { | ||||
| 							gcRunning(false); | ||||
| 						} | ||||
| 					} | ||||
| 				}); | ||||
| 			} | ||||
| 		}; | ||||
| 		t.start(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Busy gc. | ||||
|      */ | ||||
|     private void busyGC() { | ||||
|         for (int i = 0; i < 2; ++i) { | ||||
| 	        System.gc(); | ||||
| 	        System.runFinalization(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Paint button. | ||||
|      * | ||||
|      * @param gc the gc | ||||
|      */ | ||||
|     private void paintButton(GC gc) { | ||||
|         Rectangle rect = button.getClientArea(); | ||||
| 		if (isInGC) { | ||||
| 			if (disabledGcImage != null) { | ||||
| 				int buttonY = (rect.height - imgBounds.height) / 2 + rect.y; | ||||
| 				gc.drawImage(disabledGcImage, rect.x, buttonY); | ||||
| 			} | ||||
| 			return; | ||||
| 		} | ||||
|         if (armed) { | ||||
|             gc.setBackground(armCol); | ||||
|             gc.fillRectangle(rect.x, rect.y, rect.width, rect.height); | ||||
|         } | ||||
|         if (gcImage != null) { | ||||
| 			int by = (rect.height - imgBounds.height) / 2 + rect.y; // button y | ||||
| 			gc.drawImage(gcImage, rect.x, by); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Paint composite. | ||||
|      * | ||||
|      * @param gc the gc | ||||
|      */ | ||||
|     private void paintComposite(GC gc) { | ||||
| 		if (showMax && maxMemKnown) { | ||||
| 			paintCompositeMaxKnown(gc); | ||||
| 		} else { | ||||
| 			paintCompositeMaxUnknown(gc); | ||||
| 		} | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Paint composite max unknown. | ||||
|      * | ||||
|      * @param gc the gc | ||||
|      */ | ||||
|     private void paintCompositeMaxUnknown(GC gc) { | ||||
|         Rectangle rect = getClientArea(); | ||||
|         int x = rect.x; | ||||
|         int y = rect.y; | ||||
|         int w = rect.width; | ||||
|         int h = rect.height; | ||||
|         int bw = imgBounds.width; // button width | ||||
|         int dx = x + w - bw - 2; // divider x | ||||
|         int sw = w - bw - 3; // status width | ||||
|         int uw = (int) (sw * usedMem / totalMem); // used mem width | ||||
|         int ux = x + 1 + uw; // used mem right edge | ||||
|         if (bgCol != null) { | ||||
| 			gc.setBackground(bgCol); | ||||
| 		} | ||||
|         gc.fillRectangle(rect); | ||||
|         gc.setForeground(sepCol); | ||||
| 		gc.drawLine(dx, y, dx, y + h); | ||||
| 		gc.drawLine(ux, y, ux, y + h); | ||||
|         gc.setForeground(topLeftCol); | ||||
|         gc.drawLine(x, y, x+w, y); | ||||
| 		gc.drawLine(x, y, x, y+h); | ||||
| 		gc.setForeground(bottomRightCol); | ||||
|         gc.drawLine(x+w-1, y, x+w-1, y+h); | ||||
| 		gc.drawLine(x, y+h-1, x+w, y+h-1); | ||||
|  | ||||
| 		gc.setBackground(usedMemCol); | ||||
|         gc.fillRectangle(x + 1, y + 1, uw, h - 2); | ||||
|  | ||||
|         String s =  convertToMegString(usedMem)+" of "+ convertToMegString(totalMem); | ||||
|         Point p = gc.textExtent(s); | ||||
|         int sx = (rect.width - 15 - p.x) / 2 + rect.x + 1; | ||||
|         int sy = (rect.height - 2 - p.y) / 2 + rect.y + 1; | ||||
|         gc.setForeground(textCol); | ||||
|         gc.drawString(s, sx, sy, true); | ||||
|  | ||||
|         // draw an I-shaped bar in the foreground colour for the mark (if present) | ||||
|         if (mark != -1) { | ||||
|             int ssx = (int) (sw * mark / totalMem) + x + 1; | ||||
|             paintMark(gc, ssx, y, h); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Paint composite max known. | ||||
|      * | ||||
|      * @param gc the gc | ||||
|      */ | ||||
|     private void paintCompositeMaxKnown(GC gc) { | ||||
|         Rectangle rect = getClientArea(); | ||||
|         int x = rect.x; | ||||
|         int y = rect.y; | ||||
|         int w = rect.width; | ||||
|         int h = rect.height; | ||||
|         int bw = imgBounds.width; // button width | ||||
|         int dx = x + w - bw - 2; // divider x | ||||
|         int sw = w - bw - 3; // status width | ||||
|         int uw = (int) (sw * usedMem / maxMem); // used mem width | ||||
|         int ux = x + 1 + uw; // used mem right edge | ||||
|         int tw = (int) (sw * totalMem / maxMem); // current total mem width | ||||
|         int tx = x + 1 + tw; // current total mem right edge | ||||
|  | ||||
|         if (bgCol != null) { | ||||
| 			gc.setBackground(bgCol); | ||||
| 		} | ||||
|         gc.fillRectangle(rect); | ||||
|         gc.setForeground(sepCol); | ||||
| 		gc.drawLine(dx, y, dx, y + h); | ||||
| 		gc.drawLine(ux, y, ux, y + h); | ||||
| 		gc.drawLine(tx, y, tx, y + h); | ||||
|         gc.setForeground(topLeftCol); | ||||
|         gc.drawLine(x, y, x+w, y); | ||||
| 		gc.drawLine(x, y, x, y+h); | ||||
| 		gc.setForeground(bottomRightCol); | ||||
|         gc.drawLine(x+w-1, y, x+w-1, y+h); | ||||
| 		gc.drawLine(x, y+h-1, x+w, y+h-1); | ||||
|  | ||||
|         if (lowMemThreshold != 0 && ((double)(maxMem - usedMem) / (double)maxMem < lowMemThreshold)) { | ||||
|             gc.setBackground(lowMemCol); | ||||
|         } else { | ||||
|             gc.setBackground(usedMemCol); | ||||
|         } | ||||
|         gc.fillRectangle(x + 1, y + 1, uw, h - 2); | ||||
|  | ||||
|         gc.setBackground(freeMemCol); | ||||
|         gc.fillRectangle(ux + 1, y + 1, tx - (ux + 1), h - 2); | ||||
|  | ||||
|         // paint line for low memory threshold | ||||
|         if (showLowMemThreshold && lowMemThreshold != 0) { | ||||
|             gc.setForeground(lowMemCol); | ||||
|             int thresholdX = x + 1 + (int) (sw * (1.0 - lowMemThreshold)); | ||||
|             gc.drawLine(thresholdX, y + 1, thresholdX, y + h - 2); | ||||
|         } | ||||
|  | ||||
|         String s = convertToMegString(usedMem)+" of "+convertToMegString(totalMem); | ||||
|         Point p = gc.textExtent(s); | ||||
|         int sx = (rect.width - 15 - p.x) / 2 + rect.x + 1; | ||||
|         int sy = (rect.height - 2 - p.y) / 2 + rect.y + 1; | ||||
|         gc.setForeground(textCol); | ||||
|         gc.drawString(s, sx, sy, true); | ||||
|  | ||||
|         // draw an I-shaped bar in the foreground colour for the mark (if present) | ||||
|         if (mark != -1) { | ||||
|             int ssx = (int) (sw * mark / maxMem) + x + 1; | ||||
|             paintMark(gc, ssx, y, h); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| 	/** | ||||
| 	 * Paint mark. | ||||
| 	 * | ||||
| 	 * @param gc the gc | ||||
| 	 * @param x the x | ||||
| 	 * @param y the y | ||||
| 	 * @param h the h | ||||
| 	 */ | ||||
| 	private void paintMark(GC gc, int x, int y, int h) { | ||||
|         gc.setForeground(markCol); | ||||
| 		gc.drawLine(x, y+1, x, y+h-2); | ||||
| 		gc.drawLine(x-1, y+1, x+1, y+1); | ||||
| 		gc.drawLine(x-1, y+h-2, x+1, y+h-2); | ||||
| 	} | ||||
|  | ||||
|     /** | ||||
|      * Update stats. | ||||
|      */ | ||||
|     private void updateStats() { | ||||
|         Runtime runtime = Runtime.getRuntime(); | ||||
|         totalMem = runtime.totalMemory(); | ||||
|         long freeMem = runtime.freeMemory(); | ||||
|         usedMem = totalMem - freeMem; | ||||
|  | ||||
|         if (convertToMeg(prevUsedMem) != convertToMeg(usedMem)) { | ||||
|             prevUsedMem = usedMem; | ||||
|             this.hasChanged = true; | ||||
|         } | ||||
|  | ||||
|         if (prevTotalMem != totalMem) { | ||||
|             prevTotalMem = totalMem; | ||||
|             this.hasChanged = true; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update tool tip. | ||||
|      */ | ||||
|     private void updateToolTip() { | ||||
|     	String usedStr = convertToMegString(usedMem); | ||||
|     	String totalStr = convertToMegString(totalMem); | ||||
|     	String maxStr = maxMemKnown ? convertToMegString(maxMem) : "<unknown>"; | ||||
|     	String markStr = mark == -1 ? "<none>" : convertToMegString(mark); | ||||
|         String toolTip = "Heap size: "+usedStr+" of total: "+totalStr+" max: "+maxStr+" mark: "+markStr; | ||||
|         if (!toolTip.equals(getToolTipText())) { | ||||
|             setToolTipText(toolTip); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Converts the given number of bytes to a printable number of megabytes (rounded up). | ||||
|      * | ||||
|      * @param numBytes the num bytes | ||||
|      * @return the string | ||||
|      */ | ||||
|     private String convertToMegString(long numBytes) { | ||||
|         return new Long(convertToMeg(numBytes)).toString()+"M"; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Converts the given number of bytes to the corresponding number of megabytes (rounded up). | ||||
|      * | ||||
|      * @param numBytes the num bytes | ||||
|      * @return the long | ||||
|      */ | ||||
| 	private long convertToMeg(long numBytes) { | ||||
| 		return (numBytes + (512 * 1024)) / (1024 * 1024); | ||||
| 	} | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * The Class SetMarkAction. | ||||
|      */ | ||||
|     class SetMarkAction extends Action { | ||||
|          | ||||
|         /** | ||||
|          * Instantiates a new sets the mark action. | ||||
|          */ | ||||
|         SetMarkAction() { | ||||
|             super("&Set Mark"); | ||||
|         } | ||||
|  | ||||
|         /* (non-Javadoc) | ||||
|          * @see org.eclipse.jface.action.Action#run() | ||||
|          */ | ||||
|         @Override | ||||
| 		public void run() { | ||||
|             setMark(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * The Class ClearMarkAction. | ||||
|      */ | ||||
|     class ClearMarkAction extends Action { | ||||
|          | ||||
|         /** | ||||
|          * Instantiates a new clear mark action. | ||||
|          */ | ||||
|         ClearMarkAction() { | ||||
|             super("&Clear Mark"); | ||||
|         } | ||||
|  | ||||
|         /* (non-Javadoc) | ||||
|          * @see org.eclipse.jface.action.Action#run() | ||||
|          */ | ||||
|         @Override | ||||
| 		public void run() { | ||||
|             clearMark(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * The Class ShowMaxAction. | ||||
|      */ | ||||
|     class ShowMaxAction extends Action { | ||||
|     	 | ||||
| 	    /** | ||||
| 	     * Instantiates a new show max action. | ||||
| 	     */ | ||||
| 	    ShowMaxAction() { | ||||
|             super("Show &Max Heap", IAction.AS_CHECK_BOX); | ||||
|             setEnabled(maxMemKnown); | ||||
|             setChecked(showMax); | ||||
|         } | ||||
|  | ||||
|         /* (non-Javadoc) | ||||
|          * @see org.eclipse.jface.action.Action#run() | ||||
|          */ | ||||
|         @Override | ||||
| 		public void run() { | ||||
|             preferences.putBoolean(IHeapStatusConstants.PREF_SHOW_MAX, isChecked()); | ||||
|             redraw(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * The Class CloseHeapStatusAction. | ||||
|      */ | ||||
|     class CloseHeapStatusAction extends Action{ | ||||
|  | ||||
|     	/** | ||||
| 	     * Instantiates a new close heap status action. | ||||
| 	     */ | ||||
| 	    CloseHeapStatusAction(){ | ||||
|     		super("&Close"); | ||||
|     	} | ||||
|  | ||||
|     	/* (non-Javadoc) | ||||
| 	     * @see org.eclipse.jface.action.Action#run() | ||||
| 	     */ | ||||
| 	    @Override | ||||
| 		public void run(){ | ||||
| //			WorkbenchWindow wbw = (WorkbenchWindow) PlatformUI.getWorkbench() | ||||
| //					.getActiveWorkbenchWindow(); | ||||
| //			if (wbw != null) { | ||||
| //				wbw.showHeapStatus(false); | ||||
| //			} | ||||
|     		System.out.println("NYI"); | ||||
|     	} | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| @@ -1,88 +0,0 @@ | ||||
| package com.minres.scviewer.e4.application.parts; | ||||
|  | ||||
| import java.beans.PropertyChangeListener; | ||||
| import java.io.File; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
|  | ||||
| import com.minres.scviewer.database.IHierNode; | ||||
| import com.minres.scviewer.database.IWaveform; | ||||
| import com.minres.scviewer.database.IWaveformDb; | ||||
| import com.minres.scviewer.database.RelationType; | ||||
| import com.minres.scviewer.e4.application.Messages; | ||||
|  | ||||
| public class LoadingWaveformDb implements IWaveformDb { | ||||
|  | ||||
| 	private final String label = Messages.LoadingWaveformDb_0;  | ||||
|  | ||||
| 	@Override | ||||
| 	public void addPropertyChangeListener(PropertyChangeListener l) { | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public void removePropertyChangeListener(PropertyChangeListener l) { | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getFullName() { | ||||
| 		return label; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getName() { | ||||
| 		return label; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public void setName(String name) { | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public void setParentName(String name) { | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public List<IHierNode> getChildNodes() { | ||||
| 		return new ArrayList<IHierNode>(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public int compareTo(IHierNode o) { | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getMaxTime() { | ||||
| 		return new Long(0); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public IWaveform getStreamByName(String name) { | ||||
| 		return null; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public List<IWaveform> getAllWaves() { | ||||
| 		return new ArrayList<IWaveform>(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public List<RelationType> getAllRelationTypes() { | ||||
| 		return new ArrayList<RelationType>(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public boolean load(File inp) { | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public boolean isLoaded() { | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public void clear() { | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -1,696 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.e4.application.parts; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.Vector; | ||||
|  | ||||
| import javax.annotation.PostConstruct; | ||||
| import javax.inject.Inject; | ||||
| import javax.inject.Named; | ||||
|  | ||||
| import org.eclipse.e4.core.di.annotations.Optional; | ||||
| import org.eclipse.e4.core.services.events.IEventBroker; | ||||
| import org.eclipse.e4.ui.di.Focus; | ||||
| import org.eclipse.e4.ui.di.UIEventTopic; | ||||
| import org.eclipse.e4.ui.model.application.ui.basic.MPart; | ||||
| import org.eclipse.e4.ui.services.IServiceConstants; | ||||
| import org.eclipse.e4.ui.workbench.modeling.EPartService; | ||||
| import org.eclipse.e4.ui.workbench.modeling.ESelectionService; | ||||
| import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider; | ||||
| import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider; | ||||
| import org.eclipse.jface.viewers.DoubleClickEvent; | ||||
| import org.eclipse.jface.viewers.IDoubleClickListener; | ||||
| import org.eclipse.jface.viewers.ISelection; | ||||
| import org.eclipse.jface.viewers.IStructuredSelection; | ||||
| import org.eclipse.jface.viewers.ITreeContentProvider; | ||||
| import org.eclipse.jface.viewers.ITreeViewerListener; | ||||
| import org.eclipse.jface.viewers.LabelProvider; | ||||
| import org.eclipse.jface.viewers.StructuredSelection; | ||||
| import org.eclipse.jface.viewers.StyledString; | ||||
| import org.eclipse.jface.viewers.TreeExpansionEvent; | ||||
| import org.eclipse.jface.viewers.TreeViewer; | ||||
| import org.eclipse.jface.viewers.TreeViewerColumn; | ||||
| import org.eclipse.jface.viewers.Viewer; | ||||
| import org.eclipse.jface.viewers.ViewerComparator; | ||||
| import org.eclipse.jface.viewers.ViewerFilter; | ||||
| import org.eclipse.swt.SWT; | ||||
| import org.eclipse.swt.events.ControlAdapter; | ||||
| import org.eclipse.swt.events.ControlEvent; | ||||
| import org.eclipse.swt.events.ModifyEvent; | ||||
| import org.eclipse.swt.events.ModifyListener; | ||||
| import org.eclipse.swt.events.SelectionAdapter; | ||||
| import org.eclipse.swt.events.SelectionEvent; | ||||
| import org.eclipse.swt.graphics.Point; | ||||
| import org.eclipse.swt.graphics.Rectangle; | ||||
| import org.eclipse.swt.layout.GridData; | ||||
| import org.eclipse.swt.layout.GridLayout; | ||||
| import org.eclipse.swt.widgets.Composite; | ||||
| import org.eclipse.swt.widgets.Text; | ||||
| import org.eclipse.swt.widgets.Tree; | ||||
| import org.eclipse.swt.widgets.TreeItem; | ||||
|  | ||||
| import com.minres.scviewer.database.DataType; | ||||
| import com.minres.scviewer.database.ITx; | ||||
| import com.minres.scviewer.database.ITxAttribute; | ||||
| import com.minres.scviewer.database.ITxRelation; | ||||
| import com.minres.scviewer.e4.application.Messages; | ||||
| import com.minres.scviewer.e4.application.provider.TxPropertiesLabelProvider; | ||||
|  | ||||
| /** | ||||
|  * The Class TransactionDetails shows the details of a selected transaction.  | ||||
|  */ | ||||
| public class TransactionDetails { | ||||
|  | ||||
| 	/** The Constant COLUMN_FIRST. */ | ||||
| 	// Column constants | ||||
| 	public static final int COLUMN_FIRST = 0; | ||||
|  | ||||
| 	/** The Constant COLUMN_SECOND. */ | ||||
| 	public static final int COLUMN_SECOND = 1; | ||||
|  | ||||
| 	/** The Constant COLUMN_THIRD. */ | ||||
| 	public static final int COLUMN_THIRD = 2; | ||||
|  | ||||
| 	/** The event broker. */ | ||||
| 	@Inject IEventBroker eventBroker; | ||||
|  | ||||
| 	/** The selection service. */ | ||||
| 	@Inject	ESelectionService selectionService; | ||||
|  | ||||
| 	/** The name filter. */ | ||||
| 	private Text nameFilter; | ||||
|  | ||||
| 	/** The tree viewer. */ | ||||
| 	private TreeViewer treeViewer; | ||||
|  | ||||
| 	/** The col3. */ | ||||
| 	private TreeViewerColumn col1, col2, col3; | ||||
|  | ||||
| 	/** The attribute filter. */ | ||||
| 	TxAttributeFilter attributeFilter; | ||||
| 	 | ||||
| 	/** The view sorter. */ | ||||
| 	TxAttributeViewerSorter viewSorter; | ||||
|  | ||||
| 	/** The waveform viewer part. */ | ||||
| 	private WaveformViewer waveformViewerPart; | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	 * Creates the composite. | ||||
| 	 * | ||||
| 	 * @param parent the parent | ||||
| 	 */ | ||||
| 	@PostConstruct | ||||
| 	public void createComposite(final Composite parent) { | ||||
| 		parent.setLayout(new GridLayout(1, false)); | ||||
|  | ||||
| 		nameFilter = new Text(parent, SWT.BORDER); | ||||
| 		nameFilter.setMessage(Messages.TransactionDetails_0); | ||||
| 		nameFilter.addModifyListener(new ModifyListener() { | ||||
| 			@Override | ||||
| 			public void modifyText(ModifyEvent e) { | ||||
| 				attributeFilter.setSearchText(((Text) e.widget).getText()); | ||||
| 				treeViewer.refresh(); | ||||
| 				treeViewer.expandAll(true); | ||||
| 			} | ||||
| 		}); | ||||
| 		 | ||||
| 		nameFilter.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); | ||||
|  | ||||
| 		attributeFilter = new TxAttributeFilter(); | ||||
| 		viewSorter = new TxAttributeViewerSorter(); | ||||
| 		 | ||||
| 		treeViewer = new TreeViewer(parent); | ||||
| 		treeViewer.setContentProvider(new TransactionTreeContentProvider()); | ||||
| 		treeViewer.setLabelProvider(new TxPropertiesLabelProvider()); | ||||
| 		treeViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); | ||||
| 		treeViewer.addFilter(attributeFilter); | ||||
| 		treeViewer.setComparator(viewSorter); | ||||
| 		treeViewer.setAutoExpandLevel(2); | ||||
| 		treeViewer.addTreeListener(new ITreeViewerListener() { | ||||
|  | ||||
| 			@Override | ||||
| 			public void treeCollapsed(TreeExpansionEvent event) { | ||||
| 				treeViewer.getSelection(); | ||||
| 			} | ||||
|  | ||||
| 			@Override | ||||
| 			public void treeExpanded(TreeExpansionEvent event) { | ||||
| 				treeViewer.getSelection(); | ||||
| 			} | ||||
| 			 | ||||
| 		}); | ||||
|  | ||||
| 		// Set up the table | ||||
| 		Tree tree = treeViewer.getTree(); | ||||
| 		tree.setLayoutData(new GridData(GridData.FILL_BOTH)); | ||||
| 		// Add the name column | ||||
| 		col1 = new TreeViewerColumn(treeViewer, SWT.NONE); | ||||
| 		col1.getColumn().setText(Messages.TransactionDetails_1); | ||||
| 		col1.getColumn().setResizable(true); | ||||
| 		col1.setLabelProvider(new DelegatingStyledCellLabelProvider(new AttributeLabelProvider(AttributeLabelProvider.NAME))); | ||||
| 		col1.getColumn().addSelectionListener(new SelectionAdapter() { | ||||
| 			public void widgetSelected(SelectionEvent event) { | ||||
| 				((TxAttributeViewerSorter) treeViewer.getComparator()).doSort(COLUMN_FIRST); | ||||
| 				treeViewer.refresh(); | ||||
| 			} | ||||
| 		}); | ||||
| 		// Add the type column | ||||
| 		col2 = new TreeViewerColumn(treeViewer, SWT.NONE); | ||||
| 		col2.getColumn().setText(Messages.TransactionDetails_2); | ||||
| 		col2.getColumn().setResizable(true); | ||||
| 		col2.setLabelProvider(new DelegatingStyledCellLabelProvider(new AttributeLabelProvider(AttributeLabelProvider.TYPE))); | ||||
| 		col2.getColumn().addSelectionListener(new SelectionAdapter() { | ||||
| 			public void widgetSelected(SelectionEvent event) { | ||||
| 				((TxAttributeViewerSorter) treeViewer.getComparator()).doSort(COLUMN_SECOND); | ||||
| 				treeViewer.refresh(); | ||||
| 			} | ||||
| 		}); | ||||
| 		// Add the value column | ||||
| 		col3 = new TreeViewerColumn(treeViewer, SWT.NONE); | ||||
| 		col3.getColumn().setText(Messages.TransactionDetails_3); | ||||
| 		col3.getColumn().setResizable(true); | ||||
| 		col3.setLabelProvider(new DelegatingStyledCellLabelProvider(new AttributeLabelProvider(AttributeLabelProvider.VALUE))); | ||||
| 		col3.getColumn().addSelectionListener(new SelectionAdapter() { | ||||
| 			public void widgetSelected(SelectionEvent event) { | ||||
| 				((TxAttributeViewerSorter) treeViewer.getComparator()).doSort(COLUMN_SECOND); | ||||
| 				treeViewer.refresh(); | ||||
| 			} | ||||
| 		}); | ||||
| 		// Pack the columns | ||||
| //		for (int i = 0, n = table.getColumnCount(); i < n; i++) { | ||||
| //			table.getColumn(i).pack(); | ||||
| //		} | ||||
|  | ||||
| 		// Turn on the header and the lines | ||||
| 		tree.setHeaderVisible(true); | ||||
| 		tree.setLinesVisible(true); | ||||
| 		 | ||||
| 		treeViewer.addDoubleClickListener(new IDoubleClickListener(){ | ||||
|  | ||||
| 			@Override | ||||
| 			public void doubleClick(DoubleClickEvent event) { | ||||
| 				ISelection selection = treeViewer.getSelection(); | ||||
| 				if(selection instanceof IStructuredSelection){ | ||||
| 					IStructuredSelection structuredSelection = (IStructuredSelection) selection; | ||||
| 					Object selected = structuredSelection.getFirstElement(); | ||||
| 					if(selected instanceof Object[]){ | ||||
| 						Object[] selectedArray = (Object[]) selected; | ||||
| 						if(selectedArray.length==3 && selectedArray[2] instanceof ITx){ | ||||
| 							waveformViewerPart.setSelection(new StructuredSelection(selectedArray[2])); | ||||
| 							setInput(selectedArray[2]); | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			 | ||||
| 		}); | ||||
| 		parent.addControlListener(new ControlAdapter() { | ||||
| 			public void controlResized(ControlEvent e) { | ||||
| 				Tree table = treeViewer.getTree(); | ||||
| 				Rectangle area = parent.getClientArea(); | ||||
| 				Point preferredSize = table.computeSize(SWT.DEFAULT, SWT.DEFAULT); | ||||
| 				int width = area.width - 2*table.getBorderWidth(); | ||||
| 				if (preferredSize.y > area.height + table.getHeaderHeight()) { | ||||
| 					// Subtract the scrollbar width from the total column width | ||||
| 					// if a vertical scrollbar will be required | ||||
| 					Point vBarSize = table.getVerticalBar().getSize(); | ||||
| 					width -= vBarSize.x; | ||||
| 				} | ||||
| 				Point oldSize = table.getSize(); | ||||
| 				if (oldSize.x > area.width) { | ||||
| 					// table is getting smaller so make the columns  | ||||
| 					// smaller first and then resize the table to | ||||
| 					// match the client area width | ||||
| 					col1.getColumn().setWidth(width/3); | ||||
| 					col2.getColumn().setWidth(width/4); | ||||
| 					col3.getColumn().setWidth(width - col1.getColumn().getWidth()); | ||||
| 					table.setSize(area.width, area.height); | ||||
| 				} else { | ||||
| 					// table is getting bigger so make the table  | ||||
| 					// bigger first and then make the columns wider | ||||
| 					// to match the client area width | ||||
| 					table.setSize(area.width, area.height); | ||||
| 					col1.getColumn().setWidth(width/3); | ||||
| 					col2.getColumn().setWidth(width/4); | ||||
| 					col3.getColumn().setWidth(width - col1.getColumn().getWidth()- col2.getColumn().getWidth()); | ||||
| 				} | ||||
| 			} | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Sets the focus. | ||||
| 	 */ | ||||
| 	@Focus | ||||
| 	public void setFocus() { | ||||
| 		treeViewer.getTree().setFocus(); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the status event. | ||||
| 	 * | ||||
| 	 * @param part the part | ||||
| 	 * @return the status event | ||||
| 	 */ | ||||
| 	@Inject @Optional | ||||
| 	public void  getStatusEvent(@UIEventTopic(WaveformViewer.ACTIVE_WAVEFORMVIEW) WaveformViewer part) { | ||||
| 		this.waveformViewerPart=part; | ||||
| 	} | ||||
|  | ||||
| 	public void setInput(Object object) { | ||||
| 		if(object instanceof ITx){ | ||||
| 			ArrayList<String> names = new ArrayList<>(); | ||||
| 			int indexInParent=getTopItemHier(names); | ||||
| 			ArrayList<Boolean> states = getExpandedState(treeViewer.getTree().getItems()); | ||||
| 			treeViewer.setInput(object); | ||||
| 			setExpandedState(treeViewer.getTree().getItems(), states); | ||||
| 			setTopItemFromHier(names, indexInParent); | ||||
| 		} else { | ||||
| 			treeViewer.setInput(null); | ||||
| 		} | ||||
| 		 | ||||
| 	} | ||||
|  | ||||
| 	private void setExpandedState(TreeItem[] treeItems, ArrayList<Boolean> states) { | ||||
| 		for (int i = 0; i < treeItems.length; i++) { | ||||
| 			treeItems[i].setExpanded(states.size()>i?states.get(i):true); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	private ArrayList<Boolean> getExpandedState(TreeItem[] items){ | ||||
| 		ArrayList<Boolean> ret = new ArrayList<>(); | ||||
| 		for (TreeItem treeItem : items) | ||||
| 			ret.add(treeItem.getItemCount()>0?treeItem.getExpanded():true); | ||||
| 		return ret; | ||||
| 	} | ||||
| 	 | ||||
| 	private int getTopItemHier(ArrayList<String> names){ | ||||
| 		int indexInParent=-1; | ||||
| 		TreeItem obj = treeViewer.getTree().getTopItem(); | ||||
| 		if(obj!=null) { | ||||
| 			names.add(0, obj.getText(0)); | ||||
| 			if(obj.getParentItem()!=null) { | ||||
| 				TreeItem pobj=obj.getParentItem(); | ||||
| 				names.add(0, pobj.getText(0)); | ||||
| 				TreeItem[] items = pobj.getItems(); | ||||
| 				for (int i = 0; i < items.length; i++) { | ||||
| 					if(items[i]==obj) { | ||||
| 						indexInParent=i; | ||||
| 						break; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		return indexInParent; | ||||
| 	} | ||||
| 	 | ||||
| 	private void setTopItemFromHier(ArrayList<String> names, int indexInParent) { | ||||
| 		if(indexInParent<0 || names.size()==0 ) return; | ||||
| 		TreeItem selItem=null; | ||||
| 		for (TreeItem item : treeViewer.getTree().getItems()) { // find item from category | ||||
| 			if(item.getText(0).equals(names.get(0))) { | ||||
| 				if(names.size()>1) { // if we had an attribute as top item | ||||
| 					TreeItem[] subItems=item.getItems(); | ||||
| 					for(TreeItem it : subItems) { // try to align by name | ||||
| 						if(it.getText(0).equals(names.get(1))) { | ||||
| 							selItem=it; | ||||
| 							break; | ||||
| 						} | ||||
| 					} | ||||
| 					if(selItem==null && indexInParent>=0 && subItems.length>0) // name based match failed so try to use position | ||||
| 						selItem=subItems[subItems.length>indexInParent?indexInParent:subItems.length-1]; | ||||
| 				} | ||||
| 				if(selItem==null) // no match in attributes so set the category as top item | ||||
| 					selItem=item; | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 		if(selItem!=null) | ||||
| 			treeViewer.getTree().setTopItem(selItem); | ||||
| 	} | ||||
| 	/** | ||||
| 	 * Sets the selection. | ||||
| 	 * | ||||
| 	 * @param selection the new selection | ||||
| 	 */ | ||||
| 	@Inject | ||||
| 	public void setSelection(@Named(IServiceConstants.ACTIVE_SELECTION) @Optional IStructuredSelection selection, EPartService partService){ | ||||
| 		// only react if selection is actually from the WaveformViewer and nothing else | ||||
| 		MPart part = partService.getActivePart(); | ||||
| 		if( part == null || ! (part.getObject() instanceof WaveformViewer ) ) | ||||
| 			return; | ||||
| 		if(treeViewer!=null && selection!=null && !treeViewer.getTree().isDisposed()){ | ||||
| 			if( selection instanceof IStructuredSelection) { | ||||
| 				setInput(((IStructuredSelection)selection).getFirstElement());		 | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Time to string. | ||||
| 	 * | ||||
| 	 * @param time the time | ||||
| 	 * @return the string | ||||
| 	 */ | ||||
| 	String timeToString(Long time){ | ||||
| 		return waveformViewerPart.getScaledTime(time); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Tx to string. | ||||
| 	 * | ||||
| 	 * @param tx the tx | ||||
| 	 * @return the string | ||||
| 	 */ | ||||
| 	String txToString(ITx tx){ | ||||
| 		StringBuilder sb = new StringBuilder(); | ||||
| 		sb.append("tx#").append(tx.getId()).append("[").append(timeToString(tx.getBeginTime())). //$NON-NLS-1$ //$NON-NLS-2$ | ||||
| 			append(" - ").append(timeToString(tx.getEndTime())).append("]"); //$NON-NLS-1$ //$NON-NLS-2$ | ||||
| 		return sb.toString(); | ||||
| 	} | ||||
| 	 | ||||
| 	/** | ||||
| 	 * The Class TxAttributeViewerSorter. | ||||
| 	 */ | ||||
| 	class TxAttributeViewerSorter extends ViewerComparator { | ||||
| 		 | ||||
| 		/** The Constant ASCENDING. */ | ||||
| 		private static final int ASCENDING = 0; | ||||
|  | ||||
| 		/** The Constant DESCENDING. */ | ||||
| 		private static final int DESCENDING = 1; | ||||
|  | ||||
| 		/** The column. */ | ||||
| 		private int column; | ||||
|  | ||||
| 		/** The direction. */ | ||||
| 		private int direction; | ||||
|  | ||||
| 		/** | ||||
| 		 * Does the sort. If it's a different column from the previous sort, do an | ||||
| 		 * ascending sort. If it's the same column as the last sort, toggle the sort | ||||
| 		 * direction. | ||||
| 		 * | ||||
| 		 * @param column the column | ||||
| 		 */ | ||||
| 		public void doSort(int column) { | ||||
| 			if (column == this.column) { | ||||
| 				// Same column as last sort; toggle the direction | ||||
| 				direction = 1 - direction; | ||||
| 			} else { | ||||
| 				// New column; do an ascending sort | ||||
| 				this.column = column; | ||||
| 				direction = ASCENDING; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		/** | ||||
| 		 * Compares the object for sorting. | ||||
| 		 * | ||||
| 		 * @param viewer the viewer | ||||
| 		 * @param e1 the e1 | ||||
| 		 * @param e2 the e2 | ||||
| 		 * @return the int | ||||
| 		 */ | ||||
| 		public int compare(Viewer viewer, Object e1, Object e2) { | ||||
| 			int rc = 0; | ||||
| 			if(e1 instanceof ITxAttribute && e2 instanceof ITxAttribute){ | ||||
| 				ITxAttribute p1 = (ITxAttribute) e1; | ||||
| 				ITxAttribute p2 = (ITxAttribute) e2; | ||||
| 				// Determine which column and do the appropriate sort | ||||
| 				switch (column) { | ||||
| 				case COLUMN_FIRST: | ||||
| 					rc = getComparator().compare(p1.getName(), p2.getName()); | ||||
| 					break; | ||||
| 				case COLUMN_SECOND: | ||||
| 					rc = getComparator().compare(p1.getDataType().name(), p2.getDataType().name()); | ||||
| 					break; | ||||
| 				case COLUMN_THIRD: | ||||
| 					rc = getComparator().compare(p1.getValue().toString(), p2.getValue().toString()); | ||||
| 					break; | ||||
| 				} | ||||
| 				// If descending order, flip the direction | ||||
| 				if (direction == DESCENDING) rc = -rc; | ||||
| 			} | ||||
| 			return rc; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * The Class TxAttributeFilter. | ||||
| 	 */ | ||||
| 	class TxAttributeFilter extends ViewerFilter { | ||||
|  | ||||
| 		/** The search string. */ | ||||
| 		private String searchString; | ||||
|  | ||||
| 		/** | ||||
| 		 * Sets the search text. | ||||
| 		 * | ||||
| 		 * @param s the new search text | ||||
| 		 */ | ||||
| 		public void setSearchText(String s) { | ||||
| 			this.searchString = ".*" + s + ".*"; //$NON-NLS-1$ //$NON-NLS-2$ | ||||
| 		} | ||||
|  | ||||
| 		/* (non-Javadoc) | ||||
| 		 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) | ||||
| 		 */ | ||||
| 		@Override | ||||
| 		public boolean select(Viewer viewer, Object parentElement, Object element) { | ||||
| 			 | ||||
| 			if (searchString == null || searchString.length() == 0) { | ||||
| 				return true; | ||||
| 			} | ||||
| 			if(element instanceof TreeNode) { | ||||
| 				return true; | ||||
| 			} | ||||
| 			if(element instanceof ITxAttribute){ | ||||
| 				return (((ITxAttribute) element).getName().toLowerCase().matches(searchString.toLowerCase()));  | ||||
| 			}  | ||||
| 			if(element instanceof Object[]) { | ||||
| 				return (((Object[])element)[0]).toString().toLowerCase().matches(searchString.toLowerCase());	 | ||||
| 			} | ||||
| 			 | ||||
| 			return false; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * The Enum Type. | ||||
| 	 */ | ||||
| 	enum Type {/** The props. */ | ||||
| PROPS, /** The attrs. */ | ||||
|  ATTRS, /** The in rel. */ | ||||
|  IN_REL, /** The out rel. */ | ||||
|  OUT_REL} | ||||
|  | ||||
| 	/** | ||||
| 	 * The Class TreeNode. | ||||
| 	 */ | ||||
| 	class TreeNode{ | ||||
| 		 | ||||
| 		/** The type. */ | ||||
| 		public Type type; | ||||
| 		 | ||||
| 		/** The element. */ | ||||
| 		public ITx element; | ||||
|  | ||||
| 		/** | ||||
| 		 * Instantiates a new tree node. | ||||
| 		 * | ||||
| 		 * @param element the element | ||||
| 		 * @param type the type | ||||
| 		 */ | ||||
| 		public TreeNode(ITx element, Type type){ | ||||
| 			this.element=element; | ||||
| 			this.type=type; | ||||
| 		} | ||||
|  | ||||
| 		/* (non-Javadoc) | ||||
| 		 * @see java.lang.Object#toString() | ||||
| 		 */ | ||||
| 		public String toString(){ | ||||
| 			switch(type){ | ||||
| 			case PROPS:      return Messages.TransactionDetails_10; | ||||
| 			case ATTRS:	     return Messages.TransactionDetails_11; | ||||
| 			case IN_REL:     return Messages.TransactionDetails_12; | ||||
| 			case OUT_REL:    return Messages.TransactionDetails_13; | ||||
| 			} | ||||
| 			return ""; //$NON-NLS-1$ | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * The Class TransactionTreeContentProvider. | ||||
| 	 */ | ||||
| 	class TransactionTreeContentProvider implements ITreeContentProvider { | ||||
|  | ||||
| 		/* (non-Javadoc) | ||||
| 		 * @see org.eclipse.jface.viewers.IContentProvider#dispose() | ||||
| 		 */ | ||||
| 		@Override | ||||
| 		public void dispose() {	} | ||||
|  | ||||
| 		/* (non-Javadoc) | ||||
| 		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) | ||||
| 		 */ | ||||
| 		@Override | ||||
| 		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { | ||||
| 		} | ||||
|  | ||||
| 		/* (non-Javadoc) | ||||
| 		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getElements(java.lang.Object) | ||||
| 		 */ | ||||
| 		@Override | ||||
| 		public Object[] getElements(Object element) { | ||||
| 			return new Object[]{ | ||||
| 					new TreeNode((ITx)element, Type.PROPS),   | ||||
| 					new TreeNode((ITx)element, Type.ATTRS),   | ||||
| 					new TreeNode((ITx)element, Type.IN_REL), | ||||
| 					new TreeNode((ITx)element, Type.OUT_REL) | ||||
| 			}; | ||||
| 		} | ||||
|  | ||||
| 		/* (non-Javadoc) | ||||
| 		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) | ||||
| 		 */ | ||||
| 		@Override | ||||
| 		public Object[] getChildren(Object element) { | ||||
| 			if(element instanceof TreeNode){ | ||||
| 				TreeNode propertyHolder=(TreeNode) element; | ||||
| 				if(propertyHolder.type == Type.PROPS){ | ||||
| 					return new Object[][]{ | ||||
| 						{Messages.TransactionDetails_1, Messages.TransactionDetails_16, propertyHolder.element.getStream().getFullName()}, | ||||
| 						{Messages.TransactionDetails_2, Messages.TransactionDetails_16, propertyHolder.element.getGenerator().getName()}, | ||||
| 						{Messages.TransactionDetails_19, Messages.TransactionDetails_20, timeToString(propertyHolder.element.getBeginTime())}, | ||||
| 						{Messages.TransactionDetails_21, Messages.TransactionDetails_20, timeToString(propertyHolder.element.getEndTime())} | ||||
| 					}; | ||||
| 				}else if(propertyHolder.type == Type.ATTRS) | ||||
| 					return propertyHolder.element.getAttributes().toArray(); | ||||
| 				else if(propertyHolder.type == Type.IN_REL){ | ||||
| 					Vector<Object[] > res = new Vector<>(); | ||||
| 					for(ITxRelation rel:propertyHolder.element.getIncomingRelations()){ | ||||
| 						res.add(new Object[]{ | ||||
| 								rel.getRelationType(),  | ||||
| 								rel.getSource().getGenerator().getName(),  | ||||
| 								rel.getSource()}); | ||||
| 					} | ||||
| 					return res.toArray(); | ||||
| 				} else if(propertyHolder.type == Type.OUT_REL){ | ||||
| 					Vector<Object[] > res = new Vector<>(); | ||||
| 					for(ITxRelation rel:propertyHolder.element.getOutgoingRelations()){ | ||||
| 						res.add(new Object[]{ | ||||
| 								rel.getRelationType(),  | ||||
| 								rel.getTarget().getGenerator().getName(),  | ||||
| 								rel.getTarget()}); | ||||
| 					} | ||||
| 					return res.toArray(); | ||||
| 				} | ||||
| 			} | ||||
| 			return null; | ||||
| 		} | ||||
|  | ||||
| 		/* (non-Javadoc) | ||||
| 		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) | ||||
| 		 */ | ||||
| 		@Override | ||||
| 		public Object getParent(Object element) { | ||||
| 			return null; | ||||
| 		} | ||||
|  | ||||
| 		/* (non-Javadoc) | ||||
| 		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) | ||||
| 		 */ | ||||
| 		@Override | ||||
| 		public boolean hasChildren(Object element) { | ||||
| 			return getChildren(element)!=null; | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * The Class AttributeLabelProvider. | ||||
| 	 */ | ||||
| 	class AttributeLabelProvider extends LabelProvider implements IStyledLabelProvider { | ||||
| 		 | ||||
| 		/** The field. */ | ||||
| 		final int field; | ||||
| 		 | ||||
| 		/** The Constant NAME. */ | ||||
| 		public static final int NAME=0; | ||||
| 		 | ||||
| 		/** The Constant TYPE. */ | ||||
| 		public static final int TYPE=1; | ||||
| 		 | ||||
| 		/** The Constant VALUE. */ | ||||
| 		public static final int VALUE=2; | ||||
|  | ||||
| 		/** | ||||
| 		 * Instantiates a new attribute label provider. | ||||
| 		 * | ||||
| 		 * @param field the field | ||||
| 		 */ | ||||
| 		public  AttributeLabelProvider(int field) { | ||||
| 			this.field=field; | ||||
| 		} | ||||
|  | ||||
| 		/* (non-Javadoc) | ||||
| 		 * @see org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider#getStyledText(java.lang.Object) | ||||
| 		 */ | ||||
| 		@Override | ||||
| 		public StyledString getStyledText(Object element) { | ||||
| 			switch(field){ | ||||
| 			case NAME: | ||||
| 				if (element instanceof ITxAttribute) { | ||||
| 					ITxAttribute attribute = (ITxAttribute) element; | ||||
| 					return new StyledString(attribute.getName()); | ||||
| 				}else if (element instanceof ITxRelation) { | ||||
| 					return new StyledString(Messages.TransactionDetails_4); | ||||
| 				}else if(element instanceof Object[]){ | ||||
| 					Object[] elements = (Object[]) element; | ||||
| 					return new StyledString(elements[field].toString()); | ||||
| 				} else  | ||||
| 					return new StyledString(element.toString()); | ||||
| 			case TYPE: | ||||
| 				if (element instanceof ITxAttribute) { | ||||
| 					ITxAttribute attribute = (ITxAttribute) element; | ||||
| 					return new StyledString(attribute.getDataType().toString()); | ||||
| 				}else if(element instanceof Object[]){ | ||||
| 					Object[] elements = (Object[]) element; | ||||
| 					return new StyledString(elements[field].toString()); | ||||
| 				}else  | ||||
| 					return new StyledString("");					 //$NON-NLS-1$ | ||||
| 			default: | ||||
| 				if (element instanceof ITxAttribute) { | ||||
| 					ITxAttribute attribute = (ITxAttribute) element; | ||||
| 					String value = attribute.getValue().toString(); | ||||
| 					if((DataType.UNSIGNED == attribute.getDataType() || DataType.INTEGER==attribute.getDataType()) && !"0".equals(value)) { | ||||
| 						try { | ||||
| 							value = attribute.getValue().toString() + " [0x"+Long.toHexString(Long.parseLong(attribute.getValue().toString()))+"]"; | ||||
| 						} catch(NumberFormatException e) { } | ||||
| 					} | ||||
| 					return new StyledString(value); | ||||
| 				}else if(element instanceof Object[]){ | ||||
| 					Object[] elements = (Object[]) element; | ||||
| 					return new StyledString(elements[field].toString()); | ||||
| 				} else if(element instanceof ITx){ | ||||
| 					return new StyledString(txToString((ITx) element)); | ||||
| 				}else  | ||||
| 					return new StyledString("");					 //$NON-NLS-1$ | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -1,417 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package org.eclipse.wb.swt; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.io.InputStream; | ||||
| import java.lang.reflect.Constructor; | ||||
| import java.lang.reflect.Method; | ||||
| import java.net.MalformedURLException; | ||||
| import java.net.URL; | ||||
| import java.util.HashMap; | ||||
| import java.util.Iterator; | ||||
| import java.util.Map; | ||||
|  | ||||
| import org.eclipse.core.runtime.Platform; | ||||
| import org.eclipse.jface.resource.CompositeImageDescriptor; | ||||
| import org.eclipse.jface.resource.ImageDescriptor; | ||||
| import org.eclipse.swt.graphics.Image; | ||||
| import org.eclipse.swt.graphics.Point; | ||||
| import org.eclipse.swt.graphics.Rectangle; | ||||
| import org.osgi.framework.Bundle; | ||||
|  | ||||
| import com.minres.scviewer.e4.application.Messages; | ||||
|  | ||||
| /** | ||||
|  * Utility class for managing OS resources associated with SWT/JFace controls such as colors, fonts, images, | ||||
|  * etc. | ||||
|  *  | ||||
|  * !!! IMPORTANT !!! Application code must explicitly invoke the <code>dispose()</code> method to release the | ||||
|  * operating system resources managed by cached objects when those objects and OS resources are no longer | ||||
|  * needed (e.g. on application shutdown) | ||||
|  *  | ||||
|  * This class may be freely distributed as part of any application or plugin. | ||||
|  * <p> | ||||
|  *  | ||||
|  * @author scheglov_ke | ||||
|  * @author Dan Rubel | ||||
|  */ | ||||
| public class ResourceManager extends SWTResourceManager { | ||||
| 	//////////////////////////////////////////////////////////////////////////// | ||||
| 	// | ||||
| 	// Image | ||||
| 	// | ||||
| 	//////////////////////////////////////////////////////////////////////////// | ||||
| 	private static Map<ImageDescriptor, Image> m_descriptorImageMap = new HashMap<ImageDescriptor, Image>(); | ||||
| 	/** | ||||
| 	 * Returns an {@link ImageDescriptor} stored in the file at the specified path relative to the specified | ||||
| 	 * class. | ||||
| 	 *  | ||||
| 	 * @param clazz | ||||
| 	 *            the {@link Class} relative to which to find the image descriptor. | ||||
| 	 * @param path | ||||
| 	 *            the path to the image file. | ||||
| 	 * @return the {@link ImageDescriptor} stored in the file at the specified path. | ||||
| 	 */ | ||||
| 	public static ImageDescriptor getImageDescriptor(Class<?> clazz, String path) { | ||||
| 		return ImageDescriptor.createFromFile(clazz, path); | ||||
| 	} | ||||
| 	/** | ||||
| 	 * Returns an {@link ImageDescriptor} stored in the file at the specified path. | ||||
| 	 *  | ||||
| 	 * @param path | ||||
| 	 *            the path to the image file. | ||||
| 	 * @return the {@link ImageDescriptor} stored in the file at the specified path. | ||||
| 	 */ | ||||
| 	public static ImageDescriptor getImageDescriptor(String path) { | ||||
| 		try { | ||||
| 			return ImageDescriptor.createFromURL(new File(path).toURI().toURL()); | ||||
| 		} catch (MalformedURLException e) { | ||||
| 			return null; | ||||
| 		} | ||||
| 	} | ||||
| 	/** | ||||
| 	 * Returns an {@link Image} based on the specified {@link ImageDescriptor}. | ||||
| 	 *  | ||||
| 	 * @param descriptor | ||||
| 	 *            the {@link ImageDescriptor} for the {@link Image}. | ||||
| 	 * @return the {@link Image} based on the specified {@link ImageDescriptor}. | ||||
| 	 */ | ||||
| 	public static Image getImage(ImageDescriptor descriptor) { | ||||
| 		if (descriptor == null) { | ||||
| 			return null; | ||||
| 		} | ||||
| 		Image image = m_descriptorImageMap.get(descriptor); | ||||
| 		if (image == null) { | ||||
| 			image = descriptor.createImage(); | ||||
| 			m_descriptorImageMap.put(descriptor, image); | ||||
| 		} | ||||
| 		return image; | ||||
| 	} | ||||
| 	/** | ||||
| 	 * Maps images to decorated images. | ||||
| 	 */ | ||||
| 	@SuppressWarnings("unchecked") | ||||
| 	private static Map<Image, Map<Image, Image>>[] m_decoratedImageMap = new Map[LAST_CORNER_KEY]; | ||||
| 	/** | ||||
| 	 * Returns an {@link Image} composed of a base image decorated by another image. | ||||
| 	 *  | ||||
| 	 * @param baseImage | ||||
| 	 *            the base {@link Image} that should be decorated. | ||||
| 	 * @param decorator | ||||
| 	 *            the {@link Image} to decorate the base image. | ||||
| 	 * @return {@link Image} The resulting decorated image. | ||||
| 	 */ | ||||
| 	public static Image decorateImage(Image baseImage, Image decorator) { | ||||
| 		return decorateImage(baseImage, decorator, BOTTOM_RIGHT); | ||||
| 	} | ||||
| 	/** | ||||
| 	 * Returns an {@link Image} composed of a base image decorated by another image. | ||||
| 	 *  | ||||
| 	 * @param baseImage | ||||
| 	 *            the base {@link Image} that should be decorated. | ||||
| 	 * @param decorator | ||||
| 	 *            the {@link Image} to decorate the base image. | ||||
| 	 * @param corner | ||||
| 	 *            the corner to place decorator image. | ||||
| 	 * @return the resulting decorated {@link Image}. | ||||
| 	 */ | ||||
| 	public static Image decorateImage(final Image baseImage, final Image decorator, final int corner) { | ||||
| 		if (corner <= 0 || corner >= LAST_CORNER_KEY) { | ||||
| 			throw new IllegalArgumentException(Messages.ResourceManager_0); | ||||
| 		} | ||||
| 		Map<Image, Map<Image, Image>> cornerDecoratedImageMap = m_decoratedImageMap[corner]; | ||||
| 		if (cornerDecoratedImageMap == null) { | ||||
| 			cornerDecoratedImageMap = new HashMap<Image, Map<Image, Image>>(); | ||||
| 			m_decoratedImageMap[corner] = cornerDecoratedImageMap; | ||||
| 		} | ||||
| 		Map<Image, Image> decoratedMap = cornerDecoratedImageMap.get(baseImage); | ||||
| 		if (decoratedMap == null) { | ||||
| 			decoratedMap = new HashMap<Image, Image>(); | ||||
| 			cornerDecoratedImageMap.put(baseImage, decoratedMap); | ||||
| 		} | ||||
| 		// | ||||
| 		Image result = decoratedMap.get(decorator); | ||||
| 		if (result == null) { | ||||
| 			final Rectangle bib = baseImage.getBounds(); | ||||
| 			final Rectangle dib = decorator.getBounds(); | ||||
| 			final Point baseImageSize = new Point(bib.width, bib.height); | ||||
| 			CompositeImageDescriptor compositImageDesc = new CompositeImageDescriptor() { | ||||
| 				@Override | ||||
| 				protected void drawCompositeImage(int width, int height) { | ||||
| 					drawImage(createCachedImageDataProvider(baseImage), 0, 0); | ||||
| 					if (corner == TOP_LEFT) { | ||||
| 						drawImage(createCachedImageDataProvider(decorator), 0, 0); | ||||
| 					} else if (corner == TOP_RIGHT) { | ||||
| 						drawImage(createCachedImageDataProvider(decorator), bib.width - dib.width, 0); | ||||
| 					} else if (corner == BOTTOM_LEFT) { | ||||
| 						drawImage(createCachedImageDataProvider(decorator), 0, bib.height - dib.height); | ||||
| 					} else if (corner == BOTTOM_RIGHT) { | ||||
| 						drawImage(createCachedImageDataProvider(decorator), bib.width - dib.width, bib.height - dib.height); | ||||
| 					} | ||||
| 				} | ||||
| 				@Override | ||||
| 				protected Point getSize() { | ||||
| 					return baseImageSize; | ||||
| 				} | ||||
| 			}; | ||||
| 			// | ||||
| 			result = compositImageDesc.createImage(); | ||||
| 			decoratedMap.put(decorator, result); | ||||
| 		} | ||||
| 		return result; | ||||
| 	} | ||||
| 	/** | ||||
| 	 * Dispose all of the cached images. | ||||
| 	 */ | ||||
| 	public static void disposeImages() { | ||||
| 		SWTResourceManager.disposeImages(); | ||||
| 		// dispose ImageDescriptor images | ||||
| 		{ | ||||
| 			for (Iterator<Image> I = m_descriptorImageMap.values().iterator(); I.hasNext();) { | ||||
| 				I.next().dispose(); | ||||
| 			} | ||||
| 			m_descriptorImageMap.clear(); | ||||
| 		} | ||||
| 		// dispose decorated images | ||||
| 		for (int i = 0; i < m_decoratedImageMap.length; i++) { | ||||
| 			Map<Image, Map<Image, Image>> cornerDecoratedImageMap = m_decoratedImageMap[i]; | ||||
| 			if (cornerDecoratedImageMap != null) { | ||||
| 				for (Map<Image, Image> decoratedMap : cornerDecoratedImageMap.values()) { | ||||
| 					for (Image image : decoratedMap.values()) { | ||||
| 						image.dispose(); | ||||
| 					} | ||||
| 					decoratedMap.clear(); | ||||
| 				} | ||||
| 				cornerDecoratedImageMap.clear(); | ||||
| 			} | ||||
| 		} | ||||
| 		// dispose plugin images | ||||
| 		{ | ||||
| 			for (Iterator<Image> I = m_URLImageMap.values().iterator(); I.hasNext();) { | ||||
| 				I.next().dispose(); | ||||
| 			} | ||||
| 			m_URLImageMap.clear(); | ||||
| 		} | ||||
| 	} | ||||
| 	//////////////////////////////////////////////////////////////////////////// | ||||
| 	// | ||||
| 	// Plugin images support | ||||
| 	// | ||||
| 	//////////////////////////////////////////////////////////////////////////// | ||||
| 	/** | ||||
| 	 * Maps URL to images. | ||||
| 	 */ | ||||
| 	private static Map<String, Image> m_URLImageMap = new HashMap<String, Image>(); | ||||
| 	/** | ||||
| 	 * Provider for plugin resources, used by WindowBuilder at design time. | ||||
| 	 */ | ||||
| 	public interface PluginResourceProvider { | ||||
| 		URL getEntry(String symbolicName, String path); | ||||
| 	} | ||||
| 	/** | ||||
| 	 * Instance of {@link PluginResourceProvider}, used by WindowBuilder at design time. | ||||
| 	 */ | ||||
| 	private static PluginResourceProvider m_designTimePluginResourceProvider = null; | ||||
| 	/** | ||||
| 	 * Returns an {@link Image} based on a plugin and file path. | ||||
| 	 *  | ||||
| 	 * @param plugin | ||||
| 	 *            the plugin {@link Object} containing the image | ||||
| 	 * @param name | ||||
| 	 *            the path to the image within the plugin | ||||
| 	 * @return the {@link Image} stored in the file at the specified path | ||||
| 	 *  | ||||
| 	 * @deprecated Use {@link #getPluginImage(String, String)} instead. | ||||
| 	 */ | ||||
| 	@Deprecated | ||||
| 	public static Image getPluginImage(Object plugin, String name) { | ||||
| 		try { | ||||
| 			URL url = getPluginImageURL(plugin, name); | ||||
| 			if (url != null) { | ||||
| 				return getPluginImageFromUrl(url); | ||||
| 			} | ||||
| 		} catch (Throwable e) { | ||||
| 			// Ignore any exceptions | ||||
| 		} | ||||
| 		return null; | ||||
| 	} | ||||
| 	/** | ||||
| 	 * Returns an {@link Image} based on a {@link Bundle} and resource entry path. | ||||
| 	 *  | ||||
| 	 * @param symbolicName | ||||
| 	 *            the symbolic name of the {@link Bundle}. | ||||
| 	 * @param path | ||||
| 	 *            the path of the resource entry. | ||||
| 	 * @return the {@link Image} stored in the file at the specified path. | ||||
| 	 */ | ||||
| 	public static Image getPluginImage(String symbolicName, String path) { | ||||
| 		try { | ||||
| 			URL url = getPluginImageURL(symbolicName, path); | ||||
| 			if (url != null) { | ||||
| 				return getPluginImageFromUrl(url); | ||||
| 			} | ||||
| 		} catch (Throwable e) { | ||||
| 			// Ignore any exceptions | ||||
| 		} | ||||
| 		return null; | ||||
| 	} | ||||
| 	/** | ||||
| 	 * Returns an {@link Image} based on given {@link URL}. | ||||
| 	 */ | ||||
| 	private static Image getPluginImageFromUrl(URL url) { | ||||
| 		try { | ||||
| 			try { | ||||
| 				String key = url.toExternalForm(); | ||||
| 				Image image = m_URLImageMap.get(key); | ||||
| 				if (image == null) { | ||||
| 					InputStream stream = url.openStream(); | ||||
| 					try { | ||||
| 						image = getImage(stream); | ||||
| 						m_URLImageMap.put(key, image); | ||||
| 					} finally { | ||||
| 						stream.close(); | ||||
| 					} | ||||
| 				} | ||||
| 				return image; | ||||
| 			} catch (Throwable e) { | ||||
| 				// Ignore any exceptions | ||||
| 			} | ||||
| 		} catch (Throwable e) { | ||||
| 			// Ignore any exceptions | ||||
| 		} | ||||
| 		return null; | ||||
| 	} | ||||
| 	/** | ||||
| 	 * Returns an {@link ImageDescriptor} based on a plugin and file path. | ||||
| 	 *  | ||||
| 	 * @param plugin | ||||
| 	 *            the plugin {@link Object} containing the image. | ||||
| 	 * @param name | ||||
| 	 *            the path to th eimage within the plugin. | ||||
| 	 * @return the {@link ImageDescriptor} stored in the file at the specified path. | ||||
| 	 *  | ||||
| 	 * @deprecated Use {@link #getPluginImageDescriptor(String, String)} instead. | ||||
| 	 */ | ||||
| 	@Deprecated | ||||
| 	public static ImageDescriptor getPluginImageDescriptor(Object plugin, String name) { | ||||
| 		try { | ||||
| 			try { | ||||
| 				URL url = getPluginImageURL(plugin, name); | ||||
| 				return ImageDescriptor.createFromURL(url); | ||||
| 			} catch (Throwable e) { | ||||
| 				// Ignore any exceptions | ||||
| 			} | ||||
| 		} catch (Throwable e) { | ||||
| 			// Ignore any exceptions | ||||
| 		} | ||||
| 		return null; | ||||
| 	} | ||||
| 	/** | ||||
| 	 * Returns an {@link ImageDescriptor} based on a {@link Bundle} and resource entry path. | ||||
| 	 *  | ||||
| 	 * @param symbolicName | ||||
| 	 *            the symbolic name of the {@link Bundle}. | ||||
| 	 * @param path | ||||
| 	 *            the path of the resource entry. | ||||
| 	 * @return the {@link ImageDescriptor} based on a {@link Bundle} and resource entry path. | ||||
| 	 */ | ||||
| 	public static ImageDescriptor getPluginImageDescriptor(String symbolicName, String path) { | ||||
| 		try { | ||||
| 			URL url = getPluginImageURL(symbolicName, path); | ||||
| 			if (url != null) { | ||||
| 				return ImageDescriptor.createFromURL(url); | ||||
| 			} | ||||
| 		} catch (Throwable e) { | ||||
| 			// Ignore any exceptions | ||||
| 		} | ||||
| 		return null; | ||||
| 	} | ||||
| 	/** | ||||
| 	 * Returns an {@link URL} based on a {@link Bundle} and resource entry path. | ||||
| 	 */ | ||||
| 	private static URL getPluginImageURL(String symbolicName, String path) { | ||||
| 		// try runtime plugins | ||||
| 		{ | ||||
| 			Bundle bundle = Platform.getBundle(symbolicName); | ||||
| 			if (bundle != null) { | ||||
| 				return bundle.getEntry(path); | ||||
| 			} | ||||
| 		} | ||||
| 		// try design time provider | ||||
| 		if (m_designTimePluginResourceProvider != null) { | ||||
| 			return m_designTimePluginResourceProvider.getEntry(symbolicName, path); | ||||
| 		} | ||||
| 		// no such resource | ||||
| 		return null; | ||||
| 	} | ||||
| 	/** | ||||
| 	 * Returns an {@link URL} based on a plugin and file path. | ||||
| 	 *  | ||||
| 	 * @param plugin | ||||
| 	 *            the plugin {@link Object} containing the file path. | ||||
| 	 * @param name | ||||
| 	 *            the file path. | ||||
| 	 * @return the {@link URL} representing the file at the specified path. | ||||
| 	 * @throws Exception | ||||
| 	 */ | ||||
| 	private static URL getPluginImageURL(Object plugin, String name) throws Exception { | ||||
| 		// try to work with 'plugin' as with OSGI BundleContext | ||||
| 		try { | ||||
| 			Class<?> BundleClass = Class.forName("org.osgi.framework.Bundle"); //$NON-NLS-1$ | ||||
| 			Class<?> BundleContextClass = Class.forName("org.osgi.framework.BundleContext"); //$NON-NLS-1$ | ||||
| 			if (BundleContextClass.isAssignableFrom(plugin.getClass())) { | ||||
| 				Method getBundleMethod = BundleContextClass.getMethod("getBundle", new Class[0]); //$NON-NLS-1$ | ||||
| 				Object bundle = getBundleMethod.invoke(plugin, new Object[0]); | ||||
| 				// | ||||
| 				Class<?> PathClass = Class.forName("org.eclipse.core.runtime.Path"); //$NON-NLS-1$ | ||||
| 				Constructor<?> pathConstructor = PathClass.getConstructor(new Class[]{String.class}); | ||||
| 				Object path = pathConstructor.newInstance(new Object[]{name}); | ||||
| 				// | ||||
| 				Class<?> IPathClass = Class.forName("org.eclipse.core.runtime.IPath"); //$NON-NLS-1$ | ||||
| 				Class<?> PlatformClass = Class.forName("org.eclipse.core.runtime.Platform"); //$NON-NLS-1$ | ||||
| 				Method findMethod = PlatformClass.getMethod("find", new Class[]{BundleClass, IPathClass}); //$NON-NLS-1$ | ||||
| 				return (URL) findMethod.invoke(null, new Object[]{bundle, path}); | ||||
| 			} | ||||
| 		} catch (Throwable e) { | ||||
| 			// Ignore any exceptions | ||||
| 		} | ||||
| 		// else work with 'plugin' as with usual Eclipse plugin | ||||
| 		{ | ||||
| 			Class<?> PluginClass = Class.forName("org.eclipse.core.runtime.Plugin"); //$NON-NLS-1$ | ||||
| 			if (PluginClass.isAssignableFrom(plugin.getClass())) { | ||||
| 				// | ||||
| 				Class<?> PathClass = Class.forName("org.eclipse.core.runtime.Path"); //$NON-NLS-1$ | ||||
| 				Constructor<?> pathConstructor = PathClass.getConstructor(new Class[]{String.class}); | ||||
| 				Object path = pathConstructor.newInstance(new Object[]{name}); | ||||
| 				// | ||||
| 				Class<?> IPathClass = Class.forName("org.eclipse.core.runtime.IPath"); //$NON-NLS-1$ | ||||
| 				Method findMethod = PluginClass.getMethod("find", new Class[]{IPathClass}); //$NON-NLS-1$ | ||||
| 				return (URL) findMethod.invoke(plugin, new Object[]{path}); | ||||
| 			} | ||||
| 		} | ||||
| 		return null; | ||||
| 	} | ||||
| 	//////////////////////////////////////////////////////////////////////////// | ||||
| 	// | ||||
| 	// General | ||||
| 	// | ||||
| 	//////////////////////////////////////////////////////////////////////////// | ||||
| 	/** | ||||
| 	 * Dispose of cached objects and their underlying OS resources. This should only be called when the cached | ||||
| 	 * objects are no longer needed (e.g. on application shutdown). | ||||
| 	 */ | ||||
| 	public static void dispose() { | ||||
| 		disposeColors(); | ||||
| 		disposeFonts(); | ||||
| 		disposeImages(); | ||||
| 	} | ||||
| } | ||||
| @@ -1,125 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <feature | ||||
|       id="com.minres.scviewer.feature" | ||||
|       label="%featureName" | ||||
|       version="1.0.0.qualifier" | ||||
|       provider-name="%providerName"> | ||||
|  | ||||
|    <description> | ||||
|       A viewer for SystemC Verification Library transactions and VCD  | ||||
| signals. It supports a SQLite based recording as well as the built-in | ||||
| text base recording. | ||||
|    </description> | ||||
|  | ||||
|    <copyright> | ||||
|       Copyright (c) 2015 MINRES Technologies GmbH. | ||||
| All rights reserved. This program and the accompanying materials | ||||
| are made available under the terms of the Eclipse Public License | ||||
| v1.0 which accompanies this distribution, and is available at  | ||||
| http://www.eclipse.org/legal/epl-v10.html | ||||
|    </copyright> | ||||
|  | ||||
|    <license url="%licenseURL"> | ||||
|       %license | ||||
|    </license> | ||||
|  | ||||
|    <url> | ||||
|       <update label="%updateSiteName" url="http://www.minres.com/scviewer/update"/> | ||||
|       <discovery label="MINRES Website" url="http://www.minres.com"/> | ||||
|    </url> | ||||
|  | ||||
|    <requires> | ||||
|       <import plugin="org.eclipse.equinox.ds" version="1.4.200" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.equinox.util" version="1.0.500" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.osgi.services" version="3.4.0" match="greaterOrEqual"/> | ||||
|       <import plugin="com.minres.scviewer.database" version="1.0.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.codehaus.groovy" version="1.8.6" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.osgi"/> | ||||
|       <import plugin="org.eclipse.core.runtime"/> | ||||
|       <import plugin="org.eclipse.core.resources"/> | ||||
|       <import plugin="org.eclipse.jface.text"/> | ||||
|       <import plugin="org.eclipse.ui"/> | ||||
|       <import plugin="org.eclipse.ui.editors"/> | ||||
|       <import plugin="org.eclipse.ui.ide"/> | ||||
|       <import plugin="org.eclipse.ui.views.properties.tabbed"/> | ||||
|       <import plugin="org.eclipse.swt"/> | ||||
|       <import plugin="org.apache.ant"/> | ||||
|       <import plugin="com.google.guava" version="15.0.0" match="greaterOrEqual"/> | ||||
|       <import plugin="com.minres.scviewer.database.ui" version="1.0.0" match="greaterOrEqual"/> | ||||
|       <import plugin="com.minres.scviewer.database.ui.swt" version="1.0.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.core.expressions" version="3.4.600" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.jface"/> | ||||
|       <import plugin="org.junit"/> | ||||
|       <import plugin="org.eclipse.swt" version="3.103.1" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.equinox.registry"/> | ||||
|    </requires> | ||||
|  | ||||
|    <plugin | ||||
|          id="com.minres.scviewer.database" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="com.minres.scviewer.database.text" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="com.minres.scviewer.ui" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="com.minres.scviewer.database.sqlite" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="org.codehaus.groovy" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="com.minres.scviewer.database.ui" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="com.minres.scviewer.database.ui.swt" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="com.minres.scviewer.database.vcd" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="org.junit" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="org.hamcrest.core" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
| </feature> | ||||
							
								
								
									
										1
									
								
								com.minres.scviewer.parent/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								com.minres.scviewer.parent/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1 +0,0 @@ | ||||
| /workspace/ | ||||
| @@ -2,28 +2,43 @@ | ||||
| <?pde version="3.8"?> | ||||
| <target name="com.minres.scviewer.target" sequenceNumber="138"> | ||||
| <locations> | ||||
| <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit"> | ||||
| <unit id="org.eclipse.equinox.executable.feature.group" version="0.0.0"/> | ||||
| <unit id="org.eclipse.platform.sdk" version="0.0.0"/> | ||||
| <unit id="org.eclipse.sdk.feature.group" version="0.0.0"/> | ||||
| <unit id="org.eclipse.rcp.sdk.id" version="0.0.0"/> | ||||
| <unit id="org.eclipse.rcptt.core.feature.group" version="0.0.0"/> | ||||
| <unit id="org.eclipse.e4.rcp.feature.group" version="0.0.0"/> | ||||
| <unit id="org.eclipse.platform.feature.group" version="0.0.0"/> | ||||
| <repository location="http://download.eclipse.org/releases/photon"/> | ||||
| </location> | ||||
| <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit"> | ||||
| <unit id="org.codehaus.groovy24.feature.feature.group" version="3.5.1.v201909291550-e48"/> | ||||
| <repository location="http://dist.springsource.org/snapshot/GRECLIPSE/e4.8/"/> | ||||
| 	<unit id="org.codehaus.groovy25.feature.feature.group" version="3.5.1.v201909291550-e48"/> | ||||
| </location> | ||||
| 	<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit"> | ||||
| 		<repository location="http://download.eclipse.org/releases/2020-03/"/> | ||||
| 		<unit id="org.eclipse.equinox.executable.feature.group" version="0.0.0"/> | ||||
| 		<unit id="org.eclipse.equinox.p2.sdk.feature.jar" version="0.0.0"/> <!-- needed by Linux exectable--> | ||||
| 		<unit id="org.eclipse.equinox.sdk.feature.group" version="0.0.0"/> | ||||
| 		<unit id="org.eclipse.platform.sdk" version="0.0.0"/> | ||||
| 		<unit id="org.eclipse.sdk.feature.group" version="0.0.0"/> <!-- org.eclipse.equinox.p2.iu --> | ||||
| 		<unit id="org.eclipse.rcptt.core.feature.group" version="0.0.0"/><!-- com.google.guave--> | ||||
| 		<unit id="org.eclipse.pde.feature.group" version="0.0.0"/>	<!-- org.junit for testing --> | ||||
| 	</location> | ||||
| 	<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit"> | ||||
| 		<repository location="https://www.opcoach.com/repository/2020-03/"/> | ||||
| 		<unit id="com.opcoach.e4.preferences.feature.feature.group" version="0.0.0"/> | ||||
| 	</location> | ||||
| 	<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit"> | ||||
| 		<repository location="http://dist.springsource.org/snapshot/GRECLIPSE/e4.15/"/> | ||||
| 		<unit id="org.codehaus.groovy25.feature.feature.group" version="0.0.0"/> | ||||
| 	</location> | ||||
| 	<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit"> | ||||
| 		<repository location="http://download.eclipse.org/nattable/releases/1.6.0/repository/"/> | ||||
| 		<unit id="org.eclipse.nebula.widgets.nattable.core.feature.feature.group" version="1.6.0.201909181823"/> | ||||
| 		<unit id="org.eclipse.nebula.widgets.nattable.extension.e4.feature.feature.group" version="1.2.0.201909181823"/> | ||||
| 		<unit id="org.eclipse.nebula.widgets.nattable.extension.glazedlists.feature.feature.group" version="1.6.0.201909181823"/> | ||||
| 		<unit id="org.eclipse.nebula.widgets.nattable.extension.poi.feature.feature.group" version="1.5.1.201909181823"/> | ||||
| 	</location> | ||||
| 	<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit"> | ||||
| 		<repository location="http://download.eclipse.org/nebula/releases/latest"/> | ||||
| 		<unit id="org.eclipse.nebula.widgets.xviewer.feature.feature.group" version="1.1.0.202011020719"/> | ||||
| 	</location> | ||||
| 	<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit"> | ||||
| 		<repository location="http://download.eclipse.org/collections/10.4.0/repository"/> | ||||
| 		<unit id="org.eclipse.collections.feature.feature.group" version="0.0.0"/> | ||||
| 		<unit id="org.eclipse.collections.feature.source.feature.group" version="0.0.0"/> | ||||
| 	</location> | ||||
| </locations> | ||||
| <environment> | ||||
| <arch>x86_64</arch> | ||||
| <nl>de_DE</nl> | ||||
| </environment> | ||||
| <targetJRE path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/Java SE 7 [1.7.0_45]"/> | ||||
| <targetJRE path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> | ||||
| <launcherArgs> | ||||
| <vmArgs>-Dosgi.requiredJavaVersion=1.6 -XstartOnFirstThread  -Dorg.eclipse.swt.internal.carbon.smallFonts -Xdock:icon=../Resources/Eclipse.icns -Xms40m -Xmx2G</vmArgs> | ||||
| 	<vmArgs>-Xms40m -Xmx2G</vmArgs> | ||||
| </launcherArgs> | ||||
| </target> | ||||
| @@ -12,8 +12,8 @@ | ||||
|   <parent> | ||||
|   	<groupId>com.minres.scviewer</groupId> | ||||
|   	<artifactId>com.minres.scviewer.parent</artifactId> | ||||
|   	<version>2.0.0-SNAPSHOT</version> | ||||
|   	<relativePath>../com.minres.scviewer.parent</relativePath> | ||||
|   	<version>2.11.0</version> | ||||
|   	<relativePath>..</relativePath> | ||||
|   </parent> | ||||
|  | ||||
|   </project> | ||||
|   </project> | ||||
|   | ||||
| @@ -1,11 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <site> | ||||
|    <feature url="features/com.minres.scviewer.feature_1.0.0.qualifier.jar" id="com.minres.scviewer.feature" version="1.0.0.qualifier"> | ||||
|       <category name="com.minres.scviewer"/> | ||||
|    </feature> | ||||
|    <category-def name="com.minres.scviewer" label="SCViewer"> | ||||
|       <description> | ||||
|          Viewer for SystemC Verification (SCV) library's transaction recording | ||||
|       </description> | ||||
|    </category-def> | ||||
| </site> | ||||
| @@ -1,20 +0,0 @@ | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
| 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
| 	<modelVersion>4.0.0</modelVersion> | ||||
| 	<artifactId>com.minres.scviewer.updateSite</artifactId> | ||||
| 	<packaging>eclipse-repository</packaging> | ||||
| 	<parent> | ||||
| 		<groupId>com.minres.scviewer</groupId> | ||||
| 		<artifactId>com.minres.scviewer.parent</artifactId> | ||||
| 		<version>2.0.0-SNAPSHOT</version> | ||||
| 		<relativePath>../com.minres.scviewer.parent</relativePath> | ||||
| 	</parent> | ||||
| <!--	<build> | ||||
|  		<finalName>resources</finalName> | ||||
| 		<resources> | ||||
| 			<resource> | ||||
| 				<directory>resources</directory> | ||||
| 			</resource> | ||||
| 		</resources> | ||||
| 	</build> --> | ||||
| 	</project> | ||||
| @@ -1,7 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <classpath> | ||||
| 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> | ||||
| 	<classpathentry kind="src" path="src"/> | ||||
| 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> | ||||
| 	<classpathentry kind="output" path="bin"/> | ||||
| </classpath> | ||||
| @@ -1,28 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <projectDescription> | ||||
| 	<name>com.opcoach.e4.preferences</name> | ||||
| 	<comment></comment> | ||||
| 	<projects> | ||||
| 	</projects> | ||||
| 	<buildSpec> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.jdt.core.javabuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.pde.ManifestBuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.pde.SchemaBuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 	</buildSpec> | ||||
| 	<natures> | ||||
| 		<nature>org.eclipse.pde.PluginNature</nature> | ||||
| 		<nature>org.eclipse.jdt.core.javanature</nature> | ||||
| 	</natures> | ||||
| </projectDescription> | ||||
| @@ -1,12 +0,0 @@ | ||||
| eclipse.preferences.version=1 | ||||
| org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled | ||||
| org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate | ||||
| org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 | ||||
| org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve | ||||
| org.eclipse.jdt.core.compiler.compliance=1.8 | ||||
| org.eclipse.jdt.core.compiler.debug.lineNumber=generate | ||||
| org.eclipse.jdt.core.compiler.debug.localVariable=generate | ||||
| org.eclipse.jdt.core.compiler.debug.sourceFile=generate | ||||
| org.eclipse.jdt.core.compiler.problem.assertIdentifier=error | ||||
| org.eclipse.jdt.core.compiler.problem.enumIdentifier=error | ||||
| org.eclipse.jdt.core.compiler.source=1.8 | ||||
| @@ -1,19 +0,0 @@ | ||||
| Manifest-Version: 1.0 | ||||
| Bundle-ManifestVersion: 2 | ||||
| Bundle-Name: Preferences | ||||
| Bundle-SymbolicName: com.opcoach.e4.preferences;singleton:=true | ||||
| Bundle-Version: 1.0.0.qualifier | ||||
| Bundle-Vendor: OPCOACH | ||||
| Bundle-RequiredExecutionEnvironment: JavaSE-1.8 | ||||
| Require-Bundle: javax.inject, | ||||
|  org.eclipse.core.runtime;bundle-version="3.9.0", | ||||
|  org.eclipse.jface;bundle-version="3.9.0", | ||||
|  org.eclipse.e4.core.di;bundle-version="1.3.0", | ||||
|  org.eclipse.e4.ui.model.workbench;bundle-version="1.0.0", | ||||
|  org.eclipse.e4.core.services;bundle-version="1.1.0", | ||||
|  org.eclipse.e4.core.contexts;bundle-version="1.3.0", | ||||
|  org.eclipse.e4.ui.services;bundle-version="1.0.0" | ||||
| Export-Package: com.opcoach.e4.preferences, | ||||
|  com.opcoach.e4.preferences.handlers | ||||
| Bundle-ActivationPolicy: lazy | ||||
| Automatic-Module-Name: com.opcoach.e4.preferences | ||||
| @@ -1,5 +0,0 @@ | ||||
| source.. = src/ | ||||
| output.. = bin/ | ||||
| bin.includes = META-INF/,\ | ||||
|                .,\ | ||||
|                plugin.xml | ||||
| @@ -1,6 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <?eclipse version="3.4"?> | ||||
| <plugin> | ||||
|    <extension-point id="e4PreferencePages" name="e4PreferencePages" schema="schema/e4PreferencePages.exsd"/> | ||||
|    <extension-point id="e4PreferenceStoreProvider" name="e4PreferenceStoreProvider" schema="schema/e4PreferenceStoreProvider.exsd"/> | ||||
| </plugin> | ||||
| @@ -1,163 +0,0 @@ | ||||
| <?xml version='1.0' encoding='UTF-8'?> | ||||
| <!-- Schema file written by PDE --> | ||||
| <schema targetNamespace="com.opcoach.e4.preferences" xmlns="http://www.w3.org/2001/XMLSchema"> | ||||
| <annotation> | ||||
|       <appinfo> | ||||
|          <meta.schema plugin="com.opcoach.e4.preferences" id="e4PreferencePages" name="e4PreferencePages"/> | ||||
|       </appinfo> | ||||
|       <documentation> | ||||
|          [Enter description of this extension point.] | ||||
|       </documentation> | ||||
|    </annotation> | ||||
|  | ||||
|    <element name="extension"> | ||||
|       <annotation> | ||||
|          <appinfo> | ||||
|             <meta.element /> | ||||
|          </appinfo> | ||||
|       </annotation> | ||||
|       <complexType> | ||||
|          <sequence> | ||||
|             <element ref="page" minOccurs="0" maxOccurs="unbounded"/> | ||||
|          </sequence> | ||||
|          <attribute name="point" type="string" use="required"> | ||||
|             <annotation> | ||||
|                <documentation> | ||||
|                   a fully qualified identifier of the target extension point | ||||
|                </documentation> | ||||
|             </annotation> | ||||
|          </attribute> | ||||
|          <attribute name="id" type="string"> | ||||
|             <annotation> | ||||
|                <documentation> | ||||
|                   an optional identifier of the extension instance | ||||
|                </documentation> | ||||
|             </annotation> | ||||
|          </attribute> | ||||
|          <attribute name="name" type="string"> | ||||
|             <annotation> | ||||
|                <documentation> | ||||
|                   an optional name of the extension instance | ||||
|                </documentation> | ||||
|                <appinfo> | ||||
|                   <meta.attribute translatable="true"/> | ||||
|                </appinfo> | ||||
|             </annotation> | ||||
|          </attribute> | ||||
|       </complexType> | ||||
|    </element> | ||||
|  | ||||
|    <element name="page"> | ||||
|       <annotation> | ||||
|          <appinfo> | ||||
|             <meta.element labelAttribute="name"/> | ||||
|          </appinfo> | ||||
|       </annotation> | ||||
|       <complexType> | ||||
|          <sequence> | ||||
|             <element ref="keywordReference" minOccurs="0" maxOccurs="unbounded"/> | ||||
|          </sequence> | ||||
|          <attribute name="id" type="string" use="required"> | ||||
|             <annotation> | ||||
|                <documentation> | ||||
|                   a unique name that will be used to identify this page. | ||||
|                </documentation> | ||||
|             </annotation> | ||||
|          </attribute> | ||||
|          <attribute name="name" type="string" use="required"> | ||||
|             <annotation> | ||||
|                <documentation> | ||||
|                   a translatable name that will be used in the UI for this page. | ||||
|                </documentation> | ||||
|                <appinfo> | ||||
|                   <meta.attribute translatable="true"/> | ||||
|                </appinfo> | ||||
|             </annotation> | ||||
|          </attribute> | ||||
|          <attribute name="class" type="string" use="required"> | ||||
|             <annotation> | ||||
|                <documentation> | ||||
|                   a name of the fully qualified class that implements  | ||||
| <samp>org.eclipse.jface.preference.IPreferencePage</samp>. | ||||
|  | ||||
| IT IS EASYER to extend FieldEditorPreferencePage  | ||||
|  | ||||
| If this class extends directly org.eclipse.jface.preference.FieldEditorPreferencePage preferenceStore is automatically set on it. | ||||
|                </documentation> | ||||
|                <appinfo> | ||||
|                   <meta.attribute kind="java" basedOn="org.eclipse.jface.preference.FieldEditorPreferencePage:"/> | ||||
|                </appinfo> | ||||
|             </annotation> | ||||
|          </attribute> | ||||
|          <attribute name="category" type="string"> | ||||
|             <annotation> | ||||
|                <documentation> | ||||
|                   a path indicating the location of the page in the preference tree. The path may either be a parent node ID or a sequence | ||||
|      of IDs separated by '/', representing the full path from the root node. | ||||
|                </documentation> | ||||
|                <appinfo> | ||||
|                   <meta.attribute kind="identifier" basedOn="com.opcoach.e4.preferences.e4PreferencePages/page/@id"/> | ||||
|                </appinfo> | ||||
|             </annotation> | ||||
|          </attribute> | ||||
|       </complexType> | ||||
|    </element> | ||||
|  | ||||
|    <element name="keywordReference"> | ||||
|       <annotation> | ||||
|          <documentation> | ||||
|             A reference by a preference page to a keyword. See the keywords extension point. | ||||
|          </documentation> | ||||
|       </annotation> | ||||
|       <complexType> | ||||
|          <attribute name="id" type="string" use="required"> | ||||
|             <annotation> | ||||
|                <documentation> | ||||
|                   The id of the keyword being referred to. | ||||
|                </documentation> | ||||
|                <appinfo> | ||||
|                   <meta.attribute kind="identifier" basedOn="org.eclipse.ui.keywords/keyword/@id"/> | ||||
|                </appinfo> | ||||
|             </annotation> | ||||
|          </attribute> | ||||
|       </complexType> | ||||
|    </element> | ||||
|  | ||||
|    <annotation> | ||||
|       <appinfo> | ||||
|          <meta.section type="since"/> | ||||
|       </appinfo> | ||||
|       <documentation> | ||||
|          [Enter the first release in which this extension point appears.] | ||||
|       </documentation> | ||||
|    </annotation> | ||||
|  | ||||
|    <annotation> | ||||
|       <appinfo> | ||||
|          <meta.section type="examples"/> | ||||
|       </appinfo> | ||||
|       <documentation> | ||||
|          [Enter extension point usage example here.] | ||||
|       </documentation> | ||||
|    </annotation> | ||||
|  | ||||
|    <annotation> | ||||
|       <appinfo> | ||||
|          <meta.section type="apiinfo"/> | ||||
|       </appinfo> | ||||
|       <documentation> | ||||
|          [Enter API information here.] | ||||
|       </documentation> | ||||
|    </annotation> | ||||
|  | ||||
|    <annotation> | ||||
|       <appinfo> | ||||
|          <meta.section type="implementation"/> | ||||
|       </appinfo> | ||||
|       <documentation> | ||||
|          [Enter information about supplied implementation of this extension point.] | ||||
|       </documentation> | ||||
|    </annotation> | ||||
|  | ||||
|  | ||||
| </schema> | ||||
| @@ -1,149 +0,0 @@ | ||||
| <?xml version='1.0' encoding='UTF-8'?> | ||||
| <!-- Schema file written by PDE --> | ||||
| <schema targetNamespace="com.opcoach.e4.preferences" xmlns="http://www.w3.org/2001/XMLSchema"> | ||||
| <annotation> | ||||
|       <appinfo> | ||||
|          <meta.schema plugin="com.opcoach.e4.preferences" id="e4PreferenceStoreProvider" name="e4PreferenceStoreProvider"/> | ||||
|       </appinfo> | ||||
|       <documentation> | ||||
|          This extension point is used to associate a preference store to a plugin.  | ||||
| You can choose either to implement the IPreferenceStoreProvider interface or to give the ID of the IPreferenceStore to use (stored in the workbench context of your E4 application).  | ||||
| If this extension point is not used, a default ScopedPreferenceStore will be used for the preference page.  | ||||
|  | ||||
|       </documentation> | ||||
|    </annotation> | ||||
|  | ||||
|    <element name="extension"> | ||||
|       <annotation> | ||||
|          <appinfo> | ||||
|             <meta.element /> | ||||
|          </appinfo> | ||||
|       </annotation> | ||||
|       <complexType> | ||||
|          <sequence> | ||||
|             <element ref="preferenceStoreProvider" minOccurs="1" maxOccurs="unbounded"/> | ||||
|          </sequence> | ||||
|          <attribute name="point" type="string" use="required"> | ||||
|             <annotation> | ||||
|                <documentation> | ||||
|                    | ||||
|                </documentation> | ||||
|             </annotation> | ||||
|          </attribute> | ||||
|          <attribute name="id" type="string"> | ||||
|             <annotation> | ||||
|                <documentation> | ||||
|                    | ||||
|                </documentation> | ||||
|             </annotation> | ||||
|          </attribute> | ||||
|          <attribute name="name" type="string"> | ||||
|             <annotation> | ||||
|                <documentation> | ||||
|                    | ||||
|                </documentation> | ||||
|                <appinfo> | ||||
|                   <meta.attribute translatable="true"/> | ||||
|                </appinfo> | ||||
|             </annotation> | ||||
|          </attribute> | ||||
|       </complexType> | ||||
|    </element> | ||||
|  | ||||
|    <element name="preferenceStoreProvider"> | ||||
|       <complexType> | ||||
|          <attribute name="pluginId" type="string" use="required"> | ||||
|             <annotation> | ||||
|                <documentation> | ||||
|                   Set here the plugin Id concerned by this extension.  | ||||
| Must be a valid plugin ID (control will be done at runtime) | ||||
|                </documentation> | ||||
|             </annotation> | ||||
|          </attribute> | ||||
|          <attribute name="class" type="string"> | ||||
|             <annotation> | ||||
|                <documentation> | ||||
|                   Set a class to get the IPreferenceStore for the defined pluginID.  | ||||
| This parameter is optional if you use the contextId attribute. | ||||
|                </documentation> | ||||
|                <appinfo> | ||||
|                   <meta.attribute kind="java" basedOn=":com.opcoach.e4.preferences.IPreferenceStoreProvider"/> | ||||
|                </appinfo> | ||||
|             </annotation> | ||||
|          </attribute> | ||||
|          <attribute name="idInWorkbenchContext" type="string"> | ||||
|             <annotation> | ||||
|                <documentation> | ||||
|                   If no class is defined, you can set here the ID of the IPreferenceStore available in the context.  | ||||
| This object must be set in the workbenchContext using an Addon for instance, with the following code (in addon):  | ||||
|  | ||||
| @PostContextCreate | ||||
| public void initMyAddon(IEclipseContext ctx) | ||||
| { | ||||
|     IPreferenceStore ps = new ... .  // The code to create your pref store | ||||
|     ctx.set(ID set in this extension,  ps); | ||||
| } | ||||
|                </documentation> | ||||
|             </annotation> | ||||
|          </attribute> | ||||
|       </complexType> | ||||
|    </element> | ||||
|  | ||||
|    <annotation> | ||||
|       <appinfo> | ||||
|          <meta.section type="since"/> | ||||
|       </appinfo> | ||||
|       <documentation> | ||||
|          [Enter the first release in which this extension point appears.] | ||||
|       </documentation> | ||||
|    </annotation> | ||||
|  | ||||
|    <annotation> | ||||
|       <appinfo> | ||||
|          <meta.section type="examples"/> | ||||
|       </appinfo> | ||||
|       <documentation> | ||||
|          The definition could be like the following :  | ||||
|  | ||||
| pluginId="yourPluginID" | ||||
| provider="a class implementing IPreferenceStoreProvider" | ||||
|  | ||||
|  | ||||
| Or using the key in context (usefull to share the same preference store between plugins) :  | ||||
|  | ||||
| pluginId="yourPluginID" | ||||
| keyInContext="the key of the IPreferenceStore stored in context" | ||||
|  | ||||
|  | ||||
|  | ||||
|       </documentation> | ||||
|    </annotation> | ||||
|  | ||||
|    <annotation> | ||||
|       <appinfo> | ||||
|          <meta.section type="apiinfo"/> | ||||
|       </appinfo> | ||||
|       <documentation> | ||||
|          [Enter API information here.] | ||||
|       </documentation> | ||||
|    </annotation> | ||||
|  | ||||
|    <annotation> | ||||
|       <appinfo> | ||||
|          <meta.section type="implementation"/> | ||||
|       </appinfo> | ||||
|       <documentation> | ||||
|          [Enter information about supplied implementation of this extension point.] | ||||
|       </documentation> | ||||
|    </annotation> | ||||
|  | ||||
|    <annotation> | ||||
|       <appinfo> | ||||
|          <meta.section type="copyright"/> | ||||
|       </appinfo> | ||||
|       <documentation> | ||||
|          @OPCoach 2014 | ||||
|       </documentation> | ||||
|    </annotation> | ||||
|  | ||||
| </schema> | ||||
| @@ -1,25 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2014 OPCoach. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     OPCoach - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.opcoach.e4.preferences; | ||||
|  | ||||
| import org.eclipse.jface.preference.IPreferenceStore; | ||||
|  | ||||
| /** This interface can be implemented to provide a PreferenceStore for a given plugin.  | ||||
|  * This associatino must be done in the e4PreferenceStoreProvider extension point.  | ||||
|  * @author olivier | ||||
|  * | ||||
|  */ | ||||
| public interface IPreferenceStoreProvider | ||||
| { | ||||
| 	/** Must be implemented to return a preference store */ | ||||
| 	public IPreferenceStore getPreferenceStore(); | ||||
|  | ||||
| } | ||||
| @@ -1,861 +0,0 @@ | ||||
|  | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2014 OPCoach. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     Eclipse - copy of the implementation coming from jface  | ||||
|  *******************************************************************************/ | ||||
|  | ||||
| package com.opcoach.e4.preferences; | ||||
|  | ||||
| import java.io.IOException; | ||||
|  | ||||
| import org.eclipse.core.commands.common.EventManager; | ||||
| import org.eclipse.core.runtime.Assert; | ||||
| import org.eclipse.core.runtime.Platform; | ||||
| import org.eclipse.core.runtime.Plugin; | ||||
| import org.eclipse.core.runtime.SafeRunner; | ||||
| import org.eclipse.core.runtime.preferences.DefaultScope; | ||||
| import org.eclipse.core.runtime.preferences.IEclipsePreferences; | ||||
| import org.eclipse.core.runtime.preferences.IScopeContext; | ||||
| import org.eclipse.core.runtime.preferences.IEclipsePreferences.INodeChangeListener; | ||||
| import org.eclipse.core.runtime.preferences.IEclipsePreferences.NodeChangeEvent; | ||||
| import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent; | ||||
| import org.eclipse.jface.preference.IPersistentPreferenceStore; | ||||
| import org.eclipse.jface.preference.IPreferenceStore; | ||||
| import org.eclipse.jface.resource.JFaceResources; | ||||
| import org.eclipse.jface.util.IPropertyChangeListener; | ||||
| import org.eclipse.jface.util.PropertyChangeEvent; | ||||
| import org.eclipse.jface.util.SafeRunnable; | ||||
| import org.osgi.service.prefs.BackingStoreException; | ||||
|  | ||||
| /** | ||||
|  * The ScopedPreferenceStore is an IPreferenceStore that uses the scopes | ||||
|  * provided in org.eclipse.core.runtime.preferences. | ||||
|  * <p> | ||||
|  * A ScopedPreferenceStore does the lookup of a preference based on it's search | ||||
|  * scopes and sets the value of the preference based on its store scope. | ||||
|  * </p> | ||||
|  * <p> | ||||
|  * The default scope is always included in the search scopes when searching for | ||||
|  * preference values. | ||||
|  * </p> | ||||
|  *  | ||||
|  * @see org.eclipse.core.runtime.preferences | ||||
|  * @since 3.1 | ||||
|  */ | ||||
| public class ScopedPreferenceStore extends EventManager implements | ||||
| 		IPreferenceStore, IPersistentPreferenceStore { | ||||
|  | ||||
| 	/** | ||||
| 	 * The storeContext is the context where values will stored with the | ||||
| 	 * setValue methods. If there are no searchContexts this will be the search | ||||
| 	 * context. (along with the "default" context) | ||||
| 	 */ | ||||
| 	private IScopeContext storeContext; | ||||
|  | ||||
| 	/** | ||||
| 	 * The searchContext is the array of contexts that will be used by the get | ||||
| 	 * methods for searching for values. | ||||
| 	 */ | ||||
| 	private IScopeContext[] searchContexts; | ||||
|  | ||||
| 	/** | ||||
| 	 * A boolean to indicate the property changes should not be propagated. | ||||
| 	 */ | ||||
| 	protected boolean silentRunning = false; | ||||
|  | ||||
| 	/** | ||||
| 	 * The listener on the IEclipsePreferences. This is used to forward updates | ||||
| 	 * to the property change listeners on the preference store. | ||||
| 	 */ | ||||
| 	IEclipsePreferences.IPreferenceChangeListener preferencesListener; | ||||
|  | ||||
| 	/** | ||||
| 	 * The default context is the context where getDefault and setDefault | ||||
| 	 * methods will search. This context is also used in the search. | ||||
| 	 */ | ||||
| 	private IScopeContext defaultContext = DefaultScope.INSTANCE; | ||||
|  | ||||
| 	/** | ||||
| 	 * The nodeQualifer is the string used to look up the node in the contexts. | ||||
| 	 */ | ||||
| 	String nodeQualifier; | ||||
|  | ||||
| 	/** | ||||
| 	 * The defaultQualifier is the string used to look up the default node. | ||||
| 	 */ | ||||
| 	String defaultQualifier; | ||||
|  | ||||
| 	/** | ||||
| 	 * Boolean value indicating whether or not this store has changes to be | ||||
| 	 * saved. | ||||
| 	 */ | ||||
| 	private boolean dirty; | ||||
|  | ||||
| 	/** | ||||
| 	 * Create a new instance of the receiver. Store the values in context in the | ||||
| 	 * node looked up by qualifier. <strong>NOTE:</strong> Any instance of | ||||
| 	 * ScopedPreferenceStore should call | ||||
| 	 *  | ||||
| 	 * @param context | ||||
| 	 *            the scope to store to | ||||
| 	 * @param qualifier | ||||
| 	 *            the qualifier used to look up the preference node | ||||
| 	 * @param defaultQualifierPath | ||||
| 	 *            the qualifier used when looking up the defaults | ||||
| 	 */ | ||||
| 	public ScopedPreferenceStore(IScopeContext context, String qualifier, | ||||
| 			String defaultQualifierPath) { | ||||
| 		this(context, qualifier); | ||||
| 		this.defaultQualifier = defaultQualifierPath; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Create a new instance of the receiver. Store the values in context in the | ||||
| 	 * node looked up by qualifier. | ||||
| 	 *  | ||||
| 	 * @param context | ||||
| 	 *            the scope to store to | ||||
| 	 * @param qualifier | ||||
| 	 *            the qualifer used to look up the preference node | ||||
| 	 */ | ||||
| 	public ScopedPreferenceStore(IScopeContext context, String qualifier) { | ||||
| 		storeContext = context; | ||||
| 		this.nodeQualifier = qualifier; | ||||
| 		this.defaultQualifier = qualifier; | ||||
|  | ||||
| 		((IEclipsePreferences) getStorePreferences().parent()) | ||||
| 				.addNodeChangeListener(getNodeChangeListener()); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Return a node change listener that adds a removes the receiver when nodes | ||||
| 	 * change. | ||||
| 	 *  | ||||
| 	 * @return INodeChangeListener | ||||
| 	 */ | ||||
| 	private INodeChangeListener getNodeChangeListener() { | ||||
| 		return new IEclipsePreferences.INodeChangeListener() { | ||||
| 			/* | ||||
| 			 * (non-Javadoc) | ||||
| 			 *  | ||||
| 			 * @see org.eclipse.core.runtime.preferences.IEclipsePreferences.INodeChangeListener#added(org.eclipse.core.runtime.preferences.IEclipsePreferences.NodeChangeEvent) | ||||
| 			 */ | ||||
| 			public void added(NodeChangeEvent event) { | ||||
| 				if (nodeQualifier.equals(event.getChild().name()) | ||||
| 						&& isListenerAttached()) { | ||||
| 					getStorePreferences().addPreferenceChangeListener( | ||||
| 							preferencesListener); | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			/* | ||||
| 			 * (non-Javadoc) | ||||
| 			 *  | ||||
| 			 * @see org.eclipse.core.runtime.preferences.IEclipsePreferences.INodeChangeListener#removed(org.eclipse.core.runtime.preferences.IEclipsePreferences.NodeChangeEvent) | ||||
| 			 */ | ||||
| 			public void removed(NodeChangeEvent event) { | ||||
| 				// Do nothing as there are no events from removed node | ||||
| 			} | ||||
| 		}; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Initialize the preferences listener. | ||||
| 	 */ | ||||
| 	private void initializePreferencesListener() { | ||||
| 		if (preferencesListener == null) { | ||||
| 			preferencesListener = new IEclipsePreferences.IPreferenceChangeListener() { | ||||
| 				/* | ||||
| 				 * (non-Javadoc) | ||||
| 				 *  | ||||
| 				 * @see org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener#preferenceChange(org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent) | ||||
| 				 */ | ||||
| 				public void preferenceChange(PreferenceChangeEvent event) { | ||||
|  | ||||
| 					if (silentRunning) { | ||||
| 						return; | ||||
| 					} | ||||
|  | ||||
| 					Object oldValue = event.getOldValue(); | ||||
| 					Object newValue = event.getNewValue(); | ||||
| 					String key = event.getKey(); | ||||
| 					if (newValue == null) { | ||||
| 						newValue = getDefault(key, oldValue); | ||||
| 					} else if (oldValue == null) { | ||||
| 						oldValue = getDefault(key, newValue); | ||||
| 					} | ||||
| 					firePropertyChangeEvent(event.getKey(), oldValue, newValue); | ||||
| 				} | ||||
| 			}; | ||||
| 			getStorePreferences().addPreferenceChangeListener( | ||||
| 					preferencesListener); | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Does its best at determining the default value for the given key. Checks | ||||
| 	 * the given object's type and then looks in the list of defaults to see if | ||||
| 	 * a value exists. If not or if there is a problem converting the value, the | ||||
| 	 * default default value for that type is returned. | ||||
| 	 *  | ||||
| 	 * @param key | ||||
| 	 *            the key to search | ||||
| 	 * @param obj | ||||
| 	 *            the object who default we are looking for | ||||
| 	 * @return Object or <code>null</code> | ||||
| 	 */ | ||||
| 	Object getDefault(String key, Object obj) { | ||||
| 		IEclipsePreferences defaults = getDefaultPreferences(); | ||||
| 		if (obj instanceof String) { | ||||
| 			return defaults.get(key, STRING_DEFAULT_DEFAULT); | ||||
| 		} else if (obj instanceof Integer) { | ||||
| 			return new Integer(defaults.getInt(key, INT_DEFAULT_DEFAULT)); | ||||
| 		} else if (obj instanceof Double) { | ||||
| 			return new Double(defaults.getDouble(key, DOUBLE_DEFAULT_DEFAULT)); | ||||
| 		} else if (obj instanceof Float) { | ||||
| 			return new Float(defaults.getFloat(key, FLOAT_DEFAULT_DEFAULT)); | ||||
| 		} else if (obj instanceof Long) { | ||||
| 			return new Long(defaults.getLong(key, LONG_DEFAULT_DEFAULT)); | ||||
| 		} else if (obj instanceof Boolean) { | ||||
| 			return defaults.getBoolean(key, BOOLEAN_DEFAULT_DEFAULT) ? Boolean.TRUE | ||||
| 					: Boolean.FALSE; | ||||
| 		} else { | ||||
| 			return null; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Return the IEclipsePreferences node associated with this store. | ||||
| 	 *  | ||||
| 	 * @return the preference node for this store | ||||
| 	 */ | ||||
| 	IEclipsePreferences getStorePreferences() { | ||||
| 		return storeContext.getNode(nodeQualifier); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Return the default IEclipsePreferences for this store. | ||||
| 	 *  | ||||
| 	 * @return this store's default preference node | ||||
| 	 */ | ||||
| 	private IEclipsePreferences getDefaultPreferences() { | ||||
| 		return defaultContext.getNode(defaultQualifier); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener) | ||||
| 	 */ | ||||
| 	public void addPropertyChangeListener(IPropertyChangeListener listener) { | ||||
| 		initializePreferencesListener();// Create the preferences listener if it | ||||
| 		// does not exist | ||||
| 		addListenerObject(listener); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Return the preference path to search preferences on. This is the list of | ||||
| 	 * preference nodes based on the scope contexts for this store. If there are | ||||
| 	 * no search contexts set, then return this store's context. | ||||
| 	 * <p> | ||||
| 	 * Whether or not the default context should be included in the resulting | ||||
| 	 * list is specified by the <code>includeDefault</code> parameter. | ||||
| 	 * </p> | ||||
| 	 *  | ||||
| 	 * @param includeDefault | ||||
| 	 *            <code>true</code> if the default context should be included | ||||
| 	 *            and <code>false</code> otherwise | ||||
| 	 * @return IEclipsePreferences[] | ||||
| 	 * @since 3.4 public, was added in 3.1 as private method | ||||
| 	 */ | ||||
| 	public IEclipsePreferences[] getPreferenceNodes(boolean includeDefault) { | ||||
| 		// if the user didn't specify a search order, then return the scope that | ||||
| 		// this store was created on. (and optionally the default) | ||||
| 		if (searchContexts == null) { | ||||
| 			if (includeDefault) { | ||||
| 				return new IEclipsePreferences[] { getStorePreferences(), | ||||
| 						getDefaultPreferences() }; | ||||
| 			} | ||||
| 			return new IEclipsePreferences[] { getStorePreferences() }; | ||||
| 		} | ||||
| 		// otherwise the user specified a search order so return the appropriate | ||||
| 		// nodes based on it | ||||
| 		int length = searchContexts.length; | ||||
| 		if (includeDefault) { | ||||
| 			length++; | ||||
| 		} | ||||
| 		IEclipsePreferences[] preferences = new IEclipsePreferences[length]; | ||||
| 		for (int i = 0; i < searchContexts.length; i++) { | ||||
| 			preferences[i] = searchContexts[i].getNode(nodeQualifier); | ||||
| 		} | ||||
| 		if (includeDefault) { | ||||
| 			preferences[length - 1] = getDefaultPreferences(); | ||||
| 		} | ||||
| 		return preferences; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Set the search contexts to scopes. When searching for a value the seach | ||||
| 	 * will be done in the order of scope contexts and will not search the | ||||
| 	 * storeContext unless it is in this list. | ||||
| 	 * <p> | ||||
| 	 * If the given list is <code>null</code>, then clear this store's search | ||||
| 	 * contexts. This means that only this store's scope context and default | ||||
| 	 * scope will be used during preference value searching. | ||||
| 	 * </p> | ||||
| 	 * <p> | ||||
| 	 * The defaultContext will be added to the end of this list automatically | ||||
| 	 * and <em>MUST NOT</em> be included by the user. | ||||
| 	 * </p> | ||||
| 	 *  | ||||
| 	 * @param scopes | ||||
| 	 *            a list of scope contexts to use when searching, or | ||||
| 	 *            <code>null</code> | ||||
| 	 */ | ||||
| 	public void setSearchContexts(IScopeContext[] scopes) { | ||||
| 		this.searchContexts = scopes; | ||||
| 		if (scopes == null) { | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		// Assert that the default was not included (we automatically add it to | ||||
| 		// the end) | ||||
| 		for (int i = 0; i < scopes.length; i++) { | ||||
| 			if (scopes[i].equals(defaultContext)) { | ||||
| 				Assert | ||||
| 						.isTrue( | ||||
| 								false, | ||||
| 								"Do not add the default to the search contexts"); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#contains(java.lang.String) | ||||
| 	 */ | ||||
| 	public boolean contains(String name) { | ||||
| 		if (name == null) { | ||||
| 			return false; | ||||
| 		} | ||||
| 		return (Platform.getPreferencesService().get(name, null, | ||||
| 				getPreferenceNodes(true))) != null; | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#firePropertyChangeEvent(java.lang.String, | ||||
| 	 *      java.lang.Object, java.lang.Object) | ||||
| 	 */ | ||||
| 	public void firePropertyChangeEvent(String name, Object oldValue, | ||||
| 			Object newValue) { | ||||
| 		// important: create intermediate array to protect against listeners | ||||
| 		// being added/removed during the notification | ||||
| 		final Object[] list = getListeners(); | ||||
| 		if (list.length == 0) { | ||||
| 			return; | ||||
| 		} | ||||
| 		final PropertyChangeEvent event = new PropertyChangeEvent(this, name, | ||||
| 				oldValue, newValue); | ||||
| 		for (int i = 0; i < list.length; i++) { | ||||
| 			final IPropertyChangeListener listener = (IPropertyChangeListener) list[i]; | ||||
| 			SafeRunner.run(new SafeRunnable(JFaceResources | ||||
| 					.getString("PreferenceStore.changeError")) { //$NON-NLS-1$ | ||||
| 						public void run() { | ||||
| 							listener.propertyChange(event); | ||||
| 						} | ||||
| 					}); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#getBoolean(java.lang.String) | ||||
| 	 */ | ||||
| 	public boolean getBoolean(String name) { | ||||
| 		String value = internalGet(name); | ||||
| 		return value == null ? BOOLEAN_DEFAULT_DEFAULT : Boolean.valueOf(value) | ||||
| 				.booleanValue(); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#getDefaultBoolean(java.lang.String) | ||||
| 	 */ | ||||
| 	public boolean getDefaultBoolean(String name) { | ||||
| 		return getDefaultPreferences() | ||||
| 				.getBoolean(name, BOOLEAN_DEFAULT_DEFAULT); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#getDefaultDouble(java.lang.String) | ||||
| 	 */ | ||||
| 	public double getDefaultDouble(String name) { | ||||
| 		return getDefaultPreferences().getDouble(name, DOUBLE_DEFAULT_DEFAULT); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#getDefaultFloat(java.lang.String) | ||||
| 	 */ | ||||
| 	public float getDefaultFloat(String name) { | ||||
| 		return getDefaultPreferences().getFloat(name, FLOAT_DEFAULT_DEFAULT); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#getDefaultInt(java.lang.String) | ||||
| 	 */ | ||||
| 	public int getDefaultInt(String name) { | ||||
| 		return getDefaultPreferences().getInt(name, INT_DEFAULT_DEFAULT); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#getDefaultLong(java.lang.String) | ||||
| 	 */ | ||||
| 	public long getDefaultLong(String name) { | ||||
| 		return getDefaultPreferences().getLong(name, LONG_DEFAULT_DEFAULT); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#getDefaultString(java.lang.String) | ||||
| 	 */ | ||||
| 	public String getDefaultString(String name) { | ||||
| 		return getDefaultPreferences().get(name, STRING_DEFAULT_DEFAULT); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#getDouble(java.lang.String) | ||||
| 	 */ | ||||
| 	public double getDouble(String name) { | ||||
| 		String value = internalGet(name); | ||||
| 		if (value == null) { | ||||
| 			return DOUBLE_DEFAULT_DEFAULT; | ||||
| 		} | ||||
| 		try { | ||||
| 			return Double.parseDouble(value); | ||||
| 		} catch (NumberFormatException e) { | ||||
| 			return DOUBLE_DEFAULT_DEFAULT; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Return the string value for the specified key. Look in the nodes which | ||||
| 	 * are specified by this object's list of search scopes. If the value does | ||||
| 	 * not exist then return <code>null</code>. | ||||
| 	 *  | ||||
| 	 * @param key | ||||
| 	 *            the key to search with | ||||
| 	 * @return String or <code>null</code> if the value does not exist. | ||||
| 	 */ | ||||
| 	private String internalGet(String key) { | ||||
| 		return Platform.getPreferencesService().get(key, null, | ||||
| 				getPreferenceNodes(true)); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#getFloat(java.lang.String) | ||||
| 	 */ | ||||
| 	public float getFloat(String name) { | ||||
| 		String value = internalGet(name); | ||||
| 		if (value == null) { | ||||
| 			return FLOAT_DEFAULT_DEFAULT; | ||||
| 		} | ||||
| 		try { | ||||
| 			return Float.parseFloat(value); | ||||
| 		} catch (NumberFormatException e) { | ||||
| 			return FLOAT_DEFAULT_DEFAULT; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#getInt(java.lang.String) | ||||
| 	 */ | ||||
| 	public int getInt(String name) { | ||||
| 		String value = internalGet(name); | ||||
| 		if (value == null) { | ||||
| 			return INT_DEFAULT_DEFAULT; | ||||
| 		} | ||||
| 		try { | ||||
| 			return Integer.parseInt(value); | ||||
| 		} catch (NumberFormatException e) { | ||||
| 			return INT_DEFAULT_DEFAULT; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#getLong(java.lang.String) | ||||
| 	 */ | ||||
| 	public long getLong(String name) { | ||||
| 		String value = internalGet(name); | ||||
| 		if (value == null) { | ||||
| 			return LONG_DEFAULT_DEFAULT; | ||||
| 		} | ||||
| 		try { | ||||
| 			return Long.parseLong(value); | ||||
| 		} catch (NumberFormatException e) { | ||||
| 			return LONG_DEFAULT_DEFAULT; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#getString(java.lang.String) | ||||
| 	 */ | ||||
| 	public String getString(String name) { | ||||
| 		String value = internalGet(name); | ||||
| 		return value == null ? STRING_DEFAULT_DEFAULT : value; | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#isDefault(java.lang.String) | ||||
| 	 */ | ||||
| 	public boolean isDefault(String name) { | ||||
| 		if (name == null) { | ||||
| 			return false; | ||||
| 		} | ||||
| 		return (Platform.getPreferencesService().get(name, null, | ||||
| 				getPreferenceNodes(false))) == null; | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#needsSaving() | ||||
| 	 */ | ||||
| 	public boolean needsSaving() { | ||||
| 		return dirty; | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#putValue(java.lang.String, | ||||
| 	 *      java.lang.String) | ||||
| 	 */ | ||||
| 	public void putValue(String name, String value) { | ||||
| 		try { | ||||
| 			// Do not notify listeners | ||||
| 			silentRunning = true; | ||||
| 			getStorePreferences().put(name, value); | ||||
| 		} finally { | ||||
| 			// Be sure that an exception does not stop property updates | ||||
| 			silentRunning = false; | ||||
| 			dirty = true; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#removePropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener) | ||||
| 	 */ | ||||
| 	public void removePropertyChangeListener(IPropertyChangeListener listener) { | ||||
| 		removeListenerObject(listener); | ||||
| 		if (!isListenerAttached()) { | ||||
| 			disposePreferenceStoreListener(); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#setDefault(java.lang.String, | ||||
| 	 *      double) | ||||
| 	 */ | ||||
| 	public void setDefault(String name, double value) { | ||||
| 		getDefaultPreferences().putDouble(name, value); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#setDefault(java.lang.String, | ||||
| 	 *      float) | ||||
| 	 */ | ||||
| 	public void setDefault(String name, float value) { | ||||
| 		getDefaultPreferences().putFloat(name, value); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#setDefault(java.lang.String, | ||||
| 	 *      int) | ||||
| 	 */ | ||||
| 	public void setDefault(String name, int value) { | ||||
| 		getDefaultPreferences().putInt(name, value); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#setDefault(java.lang.String, | ||||
| 	 *      long) | ||||
| 	 */ | ||||
| 	public void setDefault(String name, long value) { | ||||
| 		getDefaultPreferences().putLong(name, value); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#setDefault(java.lang.String, | ||||
| 	 *      java.lang.String) | ||||
| 	 */ | ||||
| 	public void setDefault(String name, String defaultObject) { | ||||
| 		getDefaultPreferences().put(name, defaultObject); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#setDefault(java.lang.String, | ||||
| 	 *      boolean) | ||||
| 	 */ | ||||
| 	public void setDefault(String name, boolean value) { | ||||
| 		getDefaultPreferences().putBoolean(name, value); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#setToDefault(java.lang.String) | ||||
| 	 */ | ||||
| 	public void setToDefault(String name) { | ||||
|  | ||||
| 		String oldValue = getString(name); | ||||
| 		String defaultValue = getDefaultString(name); | ||||
| 		try { | ||||
| 			silentRunning = true;// Turn off updates from the store | ||||
| 			// removing a non-existing preference is a no-op so call the Core | ||||
| 			// API directly | ||||
| 			getStorePreferences().remove(name); | ||||
| 			if (oldValue != defaultValue){ | ||||
| 				dirty = true; | ||||
| 				firePropertyChangeEvent(name, oldValue, defaultValue); | ||||
| 			} | ||||
| 				 | ||||
| 		} finally { | ||||
| 			silentRunning = false;// Restart listening to preferences | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#setValue(java.lang.String, | ||||
| 	 *      double) | ||||
| 	 */ | ||||
| 	public void setValue(String name, double value) { | ||||
| 		double oldValue = getDouble(name); | ||||
| 		if (oldValue == value) { | ||||
| 			return; | ||||
| 		} | ||||
| 		try { | ||||
| 			silentRunning = true;// Turn off updates from the store | ||||
| 			if (getDefaultDouble(name) == value) { | ||||
| 				getStorePreferences().remove(name); | ||||
| 			} else { | ||||
| 				getStorePreferences().putDouble(name, value); | ||||
| 			} | ||||
| 			dirty = true; | ||||
| 			firePropertyChangeEvent(name, new Double(oldValue), new Double( | ||||
| 					value)); | ||||
| 		} finally { | ||||
| 			silentRunning = false;// Restart listening to preferences | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#setValue(java.lang.String, | ||||
| 	 *      float) | ||||
| 	 */ | ||||
| 	public void setValue(String name, float value) { | ||||
| 		float oldValue = getFloat(name); | ||||
| 		if (oldValue == value) { | ||||
| 			return; | ||||
| 		} | ||||
| 		try { | ||||
| 			silentRunning = true;// Turn off updates from the store | ||||
| 			if (getDefaultFloat(name) == value) { | ||||
| 				getStorePreferences().remove(name); | ||||
| 			} else { | ||||
| 				getStorePreferences().putFloat(name, value); | ||||
| 			} | ||||
| 			dirty = true; | ||||
| 			firePropertyChangeEvent(name, new Float(oldValue), new Float(value)); | ||||
| 		} finally { | ||||
| 			silentRunning = false;// Restart listening to preferences | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#setValue(java.lang.String, | ||||
| 	 *      int) | ||||
| 	 */ | ||||
| 	public void setValue(String name, int value) { | ||||
| 		int oldValue = getInt(name); | ||||
| 		if (oldValue == value) { | ||||
| 			return; | ||||
| 		} | ||||
| 		try { | ||||
| 			silentRunning = true;// Turn off updates from the store | ||||
| 			if (getDefaultInt(name) == value) { | ||||
| 				getStorePreferences().remove(name); | ||||
| 			} else { | ||||
| 				getStorePreferences().putInt(name, value); | ||||
| 			} | ||||
| 			dirty = true; | ||||
| 			firePropertyChangeEvent(name, new Integer(oldValue), new Integer( | ||||
| 					value)); | ||||
| 		} finally { | ||||
| 			silentRunning = false;// Restart listening to preferences | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#setValue(java.lang.String, | ||||
| 	 *      long) | ||||
| 	 */ | ||||
| 	public void setValue(String name, long value) { | ||||
| 		long oldValue = getLong(name); | ||||
| 		if (oldValue == value) { | ||||
| 			return; | ||||
| 		} | ||||
| 		try { | ||||
| 			silentRunning = true;// Turn off updates from the store | ||||
| 			if (getDefaultLong(name) == value) { | ||||
| 				getStorePreferences().remove(name); | ||||
| 			} else { | ||||
| 				getStorePreferences().putLong(name, value); | ||||
| 			} | ||||
| 			dirty = true; | ||||
| 			firePropertyChangeEvent(name, new Long(oldValue), new Long(value)); | ||||
| 		} finally { | ||||
| 			silentRunning = false;// Restart listening to preferences | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#setValue(java.lang.String, | ||||
| 	 *      java.lang.String) | ||||
| 	 */ | ||||
| 	public void setValue(String name, String value) { | ||||
| 		// Do not turn on silent running here as Strings are propagated | ||||
| 		if (getDefaultString(name).equals(value)) { | ||||
| 			getStorePreferences().remove(name); | ||||
| 		} else { | ||||
| 			getStorePreferences().put(name, value); | ||||
| 		} | ||||
| 		dirty = true; | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPreferenceStore#setValue(java.lang.String, | ||||
| 	 *      boolean) | ||||
| 	 */ | ||||
| 	public void setValue(String name, boolean value) { | ||||
| 		boolean oldValue = getBoolean(name); | ||||
| 		if (oldValue == value) { | ||||
| 			return; | ||||
| 		} | ||||
| 		try { | ||||
| 			silentRunning = true;// Turn off updates from the store | ||||
| 			if (getDefaultBoolean(name) == value) { | ||||
| 				getStorePreferences().remove(name); | ||||
| 			} else { | ||||
| 				getStorePreferences().putBoolean(name, value); | ||||
| 			} | ||||
| 			dirty = true; | ||||
| 			firePropertyChangeEvent(name, oldValue ? Boolean.TRUE | ||||
| 					: Boolean.FALSE, value ? Boolean.TRUE : Boolean.FALSE); | ||||
| 		} finally { | ||||
| 			silentRunning = false;// Restart listening to preferences | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * (non-Javadoc) | ||||
| 	 *  | ||||
| 	 * @see org.eclipse.jface.preference.IPersistentPreferenceStore#save() | ||||
| 	 */ | ||||
| 	public void save() throws IOException { | ||||
| 		try { | ||||
| 			getStorePreferences().flush(); | ||||
| 			dirty = false; | ||||
| 		} catch (BackingStoreException e) { | ||||
| 			throw new IOException(e.getMessage()); | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Dispose the receiver. | ||||
| 	 */ | ||||
| 	private void disposePreferenceStoreListener() { | ||||
|  | ||||
| 		IEclipsePreferences root = (IEclipsePreferences) Platform | ||||
| 				.getPreferencesService().getRootNode().node( | ||||
| 						Plugin.PLUGIN_PREFERENCE_SCOPE); | ||||
| 		try { | ||||
| 			if (!(root.nodeExists(nodeQualifier))) { | ||||
| 				return; | ||||
| 			} | ||||
| 		} catch (BackingStoreException e) { | ||||
| 			return;// No need to report here as the node won't have the | ||||
| 			// listener | ||||
| 		} | ||||
|  | ||||
| 		IEclipsePreferences preferences = getStorePreferences(); | ||||
| 		if (preferences == null) { | ||||
| 			return; | ||||
| 		} | ||||
| 		if (preferencesListener != null) { | ||||
| 			preferences.removePreferenceChangeListener(preferencesListener); | ||||
| 			preferencesListener = null; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -1,57 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2014 OPCoach. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     Manumitting Technologies : Brian de Alwis for initial API and implementation | ||||
|  *     OPCoach  : O.Prouvost fix bugs on hierarchy | ||||
|  *******************************************************************************//*  | ||||
|  * Handler to open up a configured preferences dialog. | ||||
|  * Written by Brian de Alwis, Manumitting Technologies. | ||||
|  * Placed in the public domain. | ||||
|  * This code comes from : http://www.eclipse.org/forums/index.php/fa/4347/ | ||||
|  * and was referenced in the thread : http://www.eclipse.org/forums/index.php/m/750139/ | ||||
|  */ | ||||
| package com.opcoach.e4.preferences.handlers; | ||||
|  | ||||
| import javax.inject.Named; | ||||
|  | ||||
| import org.eclipse.e4.core.di.annotations.CanExecute; | ||||
| import org.eclipse.e4.core.di.annotations.Execute; | ||||
| import org.eclipse.e4.ui.services.IServiceConstants; | ||||
| import org.eclipse.jface.preference.PreferenceDialog; | ||||
| import org.eclipse.jface.preference.PreferenceManager; | ||||
| import org.eclipse.jface.viewers.ViewerComparator; | ||||
| import org.eclipse.swt.widgets.Shell; | ||||
|  | ||||
| import com.opcoach.e4.preferences.internal.E4PreferenceRegistry; | ||||
|  | ||||
|  | ||||
| public class E4PreferencesHandler | ||||
| { | ||||
| 	 | ||||
| 	 | ||||
| 	@CanExecute | ||||
| 	public boolean canExecute() | ||||
| 	{ | ||||
| 		return true;	 | ||||
| 	} | ||||
| 	 | ||||
| 	@Execute | ||||
| 	public void execute(@Named(IServiceConstants.ACTIVE_SHELL) Shell shell,  E4PreferenceRegistry prefReg) | ||||
| 	{ | ||||
| 		PreferenceManager pm = prefReg.getPreferenceManager(); | ||||
| 		PreferenceDialog dialog = new PreferenceDialog(shell, pm); | ||||
| 		dialog.create(); | ||||
| 		dialog.getTreeViewer().setComparator(new ViewerComparator()); | ||||
| 		dialog.getTreeViewer().expandAll(); | ||||
| 		dialog.open(); | ||||
| 	} | ||||
|  | ||||
| 	 | ||||
|  | ||||
| 	 | ||||
| } | ||||
| @@ -1,321 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2014 OPCoach. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     OPCoach - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.opcoach.e4.preferences.internal; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.Collections; | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
|  | ||||
| import javax.inject.Inject; | ||||
|  | ||||
| import org.eclipse.core.runtime.IConfigurationElement; | ||||
| import org.eclipse.core.runtime.IExtensionRegistry; | ||||
| import org.eclipse.core.runtime.preferences.InstanceScope; | ||||
| import org.eclipse.e4.core.contexts.ContextInjectionFactory; | ||||
| import org.eclipse.e4.core.contexts.IEclipseContext; | ||||
| import org.eclipse.e4.core.di.annotations.Creatable; | ||||
| import org.eclipse.e4.core.services.contributions.IContributionFactory; | ||||
| import org.eclipse.e4.core.services.log.Logger; | ||||
| import org.eclipse.jface.preference.IPreferenceNode; | ||||
| import org.eclipse.jface.preference.IPreferenceStore; | ||||
| import org.eclipse.jface.preference.PreferenceManager; | ||||
| import org.eclipse.jface.preference.PreferenceNode; | ||||
| import org.eclipse.jface.preference.PreferencePage; | ||||
| import org.eclipse.swt.SWT; | ||||
| import org.eclipse.swt.widgets.Composite; | ||||
| import org.eclipse.swt.widgets.Control; | ||||
| import org.eclipse.swt.widgets.Label; | ||||
|  | ||||
| import com.opcoach.e4.preferences.IPreferenceStoreProvider; | ||||
| import com.opcoach.e4.preferences.ScopedPreferenceStore; | ||||
|  | ||||
| @SuppressWarnings("restriction") | ||||
| @Creatable | ||||
| public class E4PreferenceRegistry | ||||
| { | ||||
|  | ||||
| 	public static final String PREFS_PAGE_XP = "com.opcoach.e4.preferences.e4PreferencePages"; // $NON-NLS-1$ | ||||
| 	public static final String PREF_STORE_PROVIDER = "com.opcoach.e4.preferences.e4PreferenceStoreProvider"; // $NON-NLS-1$ | ||||
| 	protected static final String ELMT_PAGE = "page"; // $NON-NLS-1$ | ||||
| 	protected static final String ATTR_ID = "id"; // $NON-NLS-1$ | ||||
| 	protected static final String ATTR_CATEGORY = "category"; // $NON-NLS-1$ | ||||
| 	protected static final String ATTR_CLASS = "class"; // $NON-NLS-1$ | ||||
| 	protected static final String ATTR_NAME = "name"; // $NON-NLS-1$ | ||||
|  | ||||
| 	protected static final String ATTR_PLUGIN_ID = "pluginId"; // $NON-NLS-1$ | ||||
| 	protected static final String ATTR_ID_IN_WBCONTEXT = "idInWorkbenchContext"; // $NON-NLS-1$ | ||||
|  | ||||
| 	@Inject | ||||
| 	protected Logger logger; | ||||
|  | ||||
| 	@Inject | ||||
| 	protected IEclipseContext context; | ||||
|  | ||||
| 	@Inject | ||||
| 	protected IExtensionRegistry registry; | ||||
|  | ||||
| 	private PreferenceManager pm = null; | ||||
|  | ||||
| 	// A map of (pluginId, { IPreferenceStoreProvider, or key in wbcontext } | ||||
| 	private Map<String, Object> psProviders; | ||||
|  | ||||
| 	public PreferenceManager getPreferenceManager() | ||||
| 	{ | ||||
|  | ||||
| 		// Remember of the unbounded nodes to order parent pages. | ||||
| 		// Map<category, list of children> (all nodes except root nodes) | ||||
| 		Map<String, Collection<IPreferenceNode>> childrenNodes = new HashMap<String, Collection<IPreferenceNode>>(); | ||||
|  | ||||
| 		if (pm != null) | ||||
| 			return pm; | ||||
|  | ||||
| 		pm = new PreferenceManager(); | ||||
| 		IContributionFactory factory = context.get(IContributionFactory.class); | ||||
|  | ||||
| 		for (IConfigurationElement elmt : registry.getConfigurationElementsFor(PREFS_PAGE_XP)) | ||||
| 		{ | ||||
| 			String bundleId = elmt.getNamespaceIdentifier(); | ||||
| 			if (!elmt.getName().equals(ELMT_PAGE)) | ||||
| 			{ | ||||
| 				logger.warn("unexpected element: {0}", elmt.getName()); | ||||
| 				continue; | ||||
| 			} else if (isEmpty(elmt.getAttribute(ATTR_ID)) || isEmpty(elmt.getAttribute(ATTR_NAME))) | ||||
| 			{ | ||||
| 				logger.warn("missing id and/or name: {}", bundleId); | ||||
| 				continue; | ||||
| 			} | ||||
| 			PreferenceNode pn = null; | ||||
| 			if (elmt.getAttribute(ATTR_CLASS) != null) | ||||
| 			{ | ||||
| 				PreferencePage page = null; | ||||
| 				try | ||||
| 				{ | ||||
| 					String prefPageURI = getClassURI(bundleId, elmt.getAttribute(ATTR_CLASS)); | ||||
| 					Object object = factory.create(prefPageURI, context); | ||||
| 					if (!(object instanceof PreferencePage)) | ||||
| 					{ | ||||
| 						logger.error("Expected instance of PreferencePage: {0}", elmt.getAttribute(ATTR_CLASS)); | ||||
| 						continue; | ||||
| 					} | ||||
| 					page = (PreferencePage) object; | ||||
| 					setPreferenceStore(bundleId, page); | ||||
|  | ||||
| 				} catch (ClassNotFoundException e) | ||||
| 				{ | ||||
| 					logger.error(e); | ||||
| 					continue; | ||||
| 				} | ||||
| 				ContextInjectionFactory.inject(page, context); | ||||
| 				if ((page.getTitle() == null || page.getTitle().isEmpty()) && elmt.getAttribute(ATTR_NAME) != null) | ||||
| 				{ | ||||
| 					page.setTitle(elmt.getAttribute(ATTR_NAME)); | ||||
| 				} | ||||
|  | ||||
| 				pn = new PreferenceNode(elmt.getAttribute(ATTR_ID), page); | ||||
| 			} else | ||||
| 			{ | ||||
| 				pn = new PreferenceNode(elmt.getAttribute(ATTR_ID), new EmptyPreferencePage(elmt.getAttribute(ATTR_NAME))); | ||||
| 			} | ||||
|  | ||||
| 			// Issue 2 : Fix bug on order (see : | ||||
| 			// https://github.com/opcoach/e4Preferences/issues/2) | ||||
| 			// Add only pages at root level and remember of child pages for | ||||
| 			// categories | ||||
| 			String category = elmt.getAttribute(ATTR_CATEGORY); | ||||
| 			if (isEmpty(category)) | ||||
| 			{ | ||||
| 				pm.addToRoot(pn); | ||||
| 			} else | ||||
| 			{ | ||||
| 				/* | ||||
| 				 * IPreferenceNode parent = findNode(pm, category); if (parent | ||||
| 				 * == null) { // No parent found, but may be the extension has | ||||
| 				 * not been read yet. So remember of it unboundedNodes.put(pn, | ||||
| 				 * category); } else { parent.add(pn); } | ||||
| 				 */ | ||||
| 				// Check if this category is already registered. | ||||
| 				Collection<IPreferenceNode> children = childrenNodes.get(category); | ||||
| 				if (children == null) | ||||
| 				{ | ||||
| 					children = new ArrayList<IPreferenceNode>(); | ||||
| 					childrenNodes.put(category, children); | ||||
| 				} | ||||
| 				children.add(pn); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Must now bind pages that has not been added in nodes (depends on the | ||||
| 		// preference page read order) | ||||
| 		// Iterate on all possible categories | ||||
| 		Collection<String> categoriesDone = new ArrayList<String>(); | ||||
|  | ||||
| 		while (!childrenNodes.isEmpty()) | ||||
| 		{ | ||||
| 			for (String cat : Collections.unmodifiableSet(childrenNodes.keySet())) | ||||
| 			{ | ||||
| 				// Is this category already in preference manager ? If not add | ||||
| 				// it later... | ||||
| 				IPreferenceNode parent = findNode(pm, cat); | ||||
| 				if (parent != null) | ||||
| 				{ | ||||
| 					// Can add the list of children to this parent page... | ||||
| 					for (IPreferenceNode pn : childrenNodes.get(cat)) | ||||
| 					{ | ||||
| 						parent.add(pn); | ||||
| 					} | ||||
| 					// Ok This parent page is done. Can remove it from map | ||||
| 					// outside of this loop | ||||
| 					categoriesDone.add(cat); | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			for (String keyToRemove : categoriesDone) | ||||
| 				childrenNodes.remove(keyToRemove); | ||||
| 			categoriesDone.clear(); | ||||
|  | ||||
| 		} | ||||
|  | ||||
| 		return pm; | ||||
| 	} | ||||
|  | ||||
| 	private void setPreferenceStore(String bundleId, PreferencePage page) | ||||
| 	{ | ||||
| 		// Affect preference store to this page if this is a | ||||
| 		// PreferencePage, else, must manage it internally | ||||
| 		// Set the issue#1 on github : | ||||
| 		// https://github.com/opcoach/e4Preferences/issues/1 | ||||
| 		// And manage the extensions of IP | ||||
| 		initialisePreferenceStoreProviders(); | ||||
|  | ||||
| 		IPreferenceStore store = null; | ||||
|  | ||||
| 		// Get the preference store according to policy. | ||||
| 		Object data = psProviders.get(bundleId); | ||||
| 		if (data != null) | ||||
| 		{ | ||||
| 			if (data instanceof IPreferenceStore) | ||||
| 				store = (IPreferenceStore) data; | ||||
| 			else if (data instanceof IPreferenceStoreProvider) | ||||
| 				store = ((IPreferenceStoreProvider) data).getPreferenceStore(); | ||||
| 			else if (data instanceof String) | ||||
| 				store = (IPreferenceStore) context.get((String) data); | ||||
| 			 | ||||
| 		} else | ||||
| 		{ | ||||
| 			// Default behavior : create a preference store for this bundle and remember of it | ||||
| 			store = new ScopedPreferenceStore(InstanceScope.INSTANCE, bundleId); | ||||
| 			psProviders.put(bundleId, store); | ||||
| 		} | ||||
|  | ||||
| 		 | ||||
| 		if (store != null) | ||||
| 			page.setPreferenceStore(store); | ||||
| 		else | ||||
| 		{ | ||||
| 			logger.warn("Unable to set the preferenceStore for page " + page.getTitle() + " defined in bundle " + bundleId); | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	/** Read the e4PreferenceStoreProvider extension point */ | ||||
| 	private void initialisePreferenceStoreProviders() | ||||
| 	{ | ||||
| 		if (psProviders == null) | ||||
| 		{ | ||||
| 			IContributionFactory factory = context.get(IContributionFactory.class); | ||||
|  | ||||
| 			psProviders = new HashMap<String, Object>(); | ||||
|  | ||||
| 			// Read extensions and fill the map... | ||||
| 			for (IConfigurationElement elmt : registry.getConfigurationElementsFor(PREF_STORE_PROVIDER)) | ||||
| 			{ | ||||
| 				String declaringBundle = elmt.getNamespaceIdentifier(); | ||||
| 				String pluginId = elmt.getAttribute(ATTR_PLUGIN_ID); | ||||
| 				if (isEmpty(pluginId)) | ||||
| 				{ | ||||
| 					logger.warn("missing plugin Id in extension " + PREF_STORE_PROVIDER + " check the plugin " + declaringBundle); | ||||
| 					continue; | ||||
| 				} | ||||
|  | ||||
| 				String classname = elmt.getAttribute(ATTR_CLASS); | ||||
| 				String objectId = elmt.getAttribute(ATTR_ID_IN_WBCONTEXT); | ||||
|  | ||||
| 				if ((isEmpty(classname) && isEmpty(objectId)) || (((classname != null) && classname.length() > 0) && ((objectId != null) && objectId.length() > 0))) | ||||
| 				{ | ||||
| 					logger.warn("In extension " + PREF_STORE_PROVIDER + " only one of the two attributes (pluginId or idInWorkbenchContext) must be set. Check the plugin " | ||||
| 							+ declaringBundle); | ||||
| 					continue; | ||||
| 				} | ||||
|  | ||||
| 				// Ok can now work with data... | ||||
| 				Object data = objectId; | ||||
| 				if (classname != null) | ||||
| 				{ | ||||
| 					data = factory.create(classname, context); | ||||
| 					if (!(data instanceof IPreferenceStoreProvider)) | ||||
| 					{ | ||||
| 						logger.warn("In extension " + PREF_STORE_PROVIDER + " the class must implements IPreferenceStoreProvider. Check the plugin " + declaringBundle); | ||||
| 						continue; | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
| 				psProviders.put(pluginId, data); | ||||
|  | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	private IPreferenceNode findNode(PreferenceManager pm, String categoryId) | ||||
| 	{ | ||||
| 		for (Object o : pm.getElements(PreferenceManager.POST_ORDER)) | ||||
| 		{ | ||||
| 			if (o instanceof IPreferenceNode && ((IPreferenceNode) o).getId().equals(categoryId)) | ||||
| 			{ | ||||
| 				return (IPreferenceNode) o; | ||||
| 			} | ||||
| 		} | ||||
| 		return null; | ||||
| 	} | ||||
|  | ||||
| 	private String getClassURI(String definingBundleId, String spec) throws ClassNotFoundException | ||||
| 	{ | ||||
| 		if (spec.startsWith("platform:")) | ||||
| 		{ | ||||
| 			return spec; | ||||
| 		} // $NON-NLS-1$ | ||||
| 		return "bundleclass://" + definingBundleId + '/' + spec; | ||||
| 	} | ||||
|  | ||||
| 	private boolean isEmpty(String value) | ||||
| 	{ | ||||
| 		return value == null || value.trim().isEmpty(); | ||||
| 	} | ||||
|  | ||||
| 	static class EmptyPreferencePage extends PreferencePage | ||||
| 	{ | ||||
|  | ||||
| 		public EmptyPreferencePage(String title) | ||||
| 		{ | ||||
| 			setTitle(title); | ||||
| 			noDefaultAndApplyButton(); | ||||
| 		} | ||||
|  | ||||
| 		@Override | ||||
| 		protected Control createContents(Composite parent) | ||||
| 		{ | ||||
| 			return new Label(parent, SWT.NONE); | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| } | ||||
							
								
								
									
										23
									
								
								features/com.minres.scviewer.database.feature/.project
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								features/com.minres.scviewer.database.feature/.project
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <projectDescription> | ||||
| 	<name>com.minres.scviewer.database.feature</name> | ||||
| 	<comment></comment> | ||||
| 	<projects> | ||||
| 	</projects> | ||||
| 	<buildSpec> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.pde.FeatureBuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.m2e.core.maven2Builder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 	</buildSpec> | ||||
| 	<natures> | ||||
| 		<nature>org.eclipse.m2e.core.maven2Nature</nature> | ||||
| 		<nature>org.eclipse.pde.FeatureNature</nature> | ||||
| 	</natures> | ||||
| </projectDescription> | ||||
| @@ -1,2 +1,4 @@ | ||||
| bin.includes = feature.xml,\ | ||||
|                feature.properties | ||||
| src.includes = feature.properties,\ | ||||
|                feature.xml | ||||
							
								
								
									
										102
									
								
								features/com.minres.scviewer.database.feature/feature.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								features/com.minres.scviewer.database.feature/feature.properties
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,102 @@ | ||||
| featureName=SystemC simulation results viewer database loaders | ||||
| providerName=MINRES Technologies GmbH | ||||
| updateSiteName=SC Viewer Database Loader Updates | ||||
| description=A viewer for SystemC Verification Library transactions and VCD signals. | ||||
| licenseURL=license.html | ||||
| license=\ | ||||
| ECLIPSE FOUNDATION SOFTWARE USER AGREEMENT\n\ | ||||
| March 17, 2005\n\ | ||||
| \n\ | ||||
| Usage Of Content\n\ | ||||
| \n\ | ||||
| THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\ | ||||
| OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\ | ||||
| USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\ | ||||
| AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\ | ||||
| NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\ | ||||
| AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\ | ||||
| AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\ | ||||
| OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\ | ||||
| TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\ | ||||
| OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\ | ||||
| BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\ | ||||
| \n\ | ||||
| Applicable Licenses\n\ | ||||
| \n\ | ||||
| Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\ | ||||
| is provided to you under the terms and conditions of the Eclipse Public\n\ | ||||
| License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\ | ||||
| Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\ | ||||
| For purposes of the EPL, "Program" will mean the Content.\n\ | ||||
| \n\ | ||||
| Content includes, but is not limited to, source code, object code,\n\ | ||||
| documentation and other files maintained in the Eclipse.org CVS\n\ | ||||
| repository ("Repository") in CVS modules ("Modules") and made available\n\ | ||||
| as downloadable archives ("Downloads").\n\ | ||||
| \n\ | ||||
|    - Content may be structured and packaged into modules to facilitate delivering,\n\ | ||||
|      extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\ | ||||
|      plug-in fragments ("Fragments"), and features ("Features").\n\ | ||||
|    - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\ | ||||
|      in a directory named "plugins".\n\ | ||||
|    - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\ | ||||
|      Each Feature may be packaged as a sub-directory in a directory named "features".\n\ | ||||
|      Within a Feature, files named "feature.xml" may contain a list of the names and version\n\ | ||||
|      numbers of the Plug-ins and/or Fragments associated with that Feature.\n\ | ||||
|    - Features may also include other Features ("Included Features"). Within a Feature, files\n\ | ||||
|      named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\ | ||||
| \n\ | ||||
| Features may also include other Features ("Included Features"). Files named\n\ | ||||
| "feature.xml" may contain a list of the names and version numbers of\n\ | ||||
| Included Features.\n\ | ||||
| \n\ | ||||
| The terms and conditions governing Plug-ins and Fragments should be\n\ | ||||
| contained in files named "about.html" ("Abouts"). The terms and\n\ | ||||
| conditions governing Features and Included Features should be contained\n\ | ||||
| in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\ | ||||
| Licenses may be located in any directory of a Download or Module\n\ | ||||
| including, but not limited to the following locations:\n\ | ||||
| \n\ | ||||
|    - The top-level (root) directory\n\ | ||||
|    - Plug-in and Fragment directories\n\ | ||||
|    - Inside Plug-ins and Fragments packaged as JARs\n\ | ||||
|    - Sub-directories of the directory named "src" of certain Plug-ins\n\ | ||||
|    - Feature directories\n\ | ||||
| \n\ | ||||
| Note: if a Feature made available by the Eclipse Foundation is installed using the\n\ | ||||
| Eclipse Update Manager, you must agree to a license ("Feature Update\n\ | ||||
| License") during the installation process. If the Feature contains\n\ | ||||
| Included Features, the Feature Update License should either provide you\n\ | ||||
| with the terms and conditions governing the Included Features or inform\n\ | ||||
| you where you can locate them. Feature Update Licenses may be found in\n\ | ||||
| the "license" property of files named "feature.properties". Such Abouts,\n\ | ||||
| Feature Licenses and Feature Update Licenses contain the terms and\n\ | ||||
| conditions (or references to such terms and conditions) that govern your\n\ | ||||
| use of the associated Content in that directory.\n\ | ||||
| \n\ | ||||
| THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER\n\ | ||||
| TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\ | ||||
| SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\ | ||||
| \n\ | ||||
|     - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\ | ||||
|     - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\ | ||||
|     - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\ | ||||
|     - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\ | ||||
|     - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\ | ||||
|     - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\ | ||||
| \n\ | ||||
| IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\ | ||||
| TO USE OF THE CONTENT. If no About, Feature License or Feature Update License\n\ | ||||
| is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\ | ||||
| govern that particular Content.\n\ | ||||
| \n\ | ||||
| Cryptography\n\ | ||||
| \n\ | ||||
| Content may contain encryption software. The country in which you are\n\ | ||||
| currently may have restrictions on the import, possession, and use,\n\ | ||||
| and/or re-export to another country, of encryption software. BEFORE\n\ | ||||
| using any encryption software, please check the country's laws,\n\ | ||||
| regulations and policies concerning the import, possession, or use,\n\ | ||||
| and re-export of encryption software, to see if this is permitted.\n\ | ||||
| \n\ | ||||
| Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n | ||||
							
								
								
									
										73
									
								
								features/com.minres.scviewer.database.feature/feature.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								features/com.minres.scviewer.database.feature/feature.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <feature | ||||
|       id="com.minres.scviewer.database.feature" | ||||
|       label="%featureName" | ||||
|       version="3.0.0.qualifier" | ||||
|       provider-name="%providerName"> | ||||
|  | ||||
|    <description> | ||||
|       The database loaders for SystemC Verification Library transactions and VCD signals. They support SQLite based recording as well as the built-in text base recording. | ||||
|    </description> | ||||
|  | ||||
|    <copyright> | ||||
|       Copyright (c) 2015-2021 MINRES Technologies GmbH. | ||||
| All rights reserved. This program and the accompanying materials | ||||
| are made available under the terms of the Eclipse Public License | ||||
| v1.0 which accompanies this distribution, and is available at  | ||||
| http://www.eclipse.org/legal/epl-v10.html | ||||
|    </copyright> | ||||
|  | ||||
|    <license url="%licenseURL"> | ||||
|       %license | ||||
|    </license> | ||||
|  | ||||
|    <url> | ||||
|       <update label="%updateSiteName" url="http://www.minres.com/scviewer/update"/> | ||||
|       <discovery label="MINRES Website" url="http://www.minres.com"/> | ||||
|    </url> | ||||
|  | ||||
|    <requires> | ||||
|       <import plugin="org.codehaus.groovy" version="2.5.8" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.osgi.services" version="3.4.0" match="greaterOrEqual"/> | ||||
|       <import plugin="com.google.guava" version="15.0.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.osgi"/> | ||||
|       <import plugin="com.minres.scviewer.database" version="1.0.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.core.runtime"/> | ||||
|    </requires> | ||||
|  | ||||
|    <plugin | ||||
|          id="com.minres.scviewer.database" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="com.minres.scviewer.database.text" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="com.minres.scviewer.database.sqlite" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="com.minres.scviewer.database.vcd" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="com.google.guava" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
| </feature> | ||||
							
								
								
									
										12
									
								
								features/com.minres.scviewer.database.feature/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								features/com.minres.scviewer.database.feature/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|   <modelVersion>4.0.0</modelVersion> | ||||
|   <artifactId>com.minres.scviewer.database.feature</artifactId> | ||||
|   <packaging>eclipse-feature</packaging> | ||||
|   <parent> | ||||
|   	<groupId>com.minres.scviewer</groupId> | ||||
|   	<artifactId>com.minres.scviewer.parent</artifactId> | ||||
|   	<version>2.11.0</version> | ||||
| 	<relativePath>../..</relativePath> | ||||
|   </parent> | ||||
|   <version>3.0.0-SNAPSHOT</version> | ||||
| </project> | ||||
							
								
								
									
										17
									
								
								features/com.minres.scviewer.e4.feature/.project
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								features/com.minres.scviewer.e4.feature/.project
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <projectDescription> | ||||
| 	<name>com.minres.scviewer.e4.feature</name> | ||||
| 	<comment></comment> | ||||
| 	<projects> | ||||
| 	</projects> | ||||
| 	<buildSpec> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.pde.FeatureBuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 	</buildSpec> | ||||
| 	<natures> | ||||
| 		<nature>org.eclipse.pde.FeatureNature</nature> | ||||
| 	</natures> | ||||
| </projectDescription> | ||||
							
								
								
									
										1
									
								
								features/com.minres.scviewer.e4.feature/build.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								features/com.minres.scviewer.e4.feature/build.properties
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| bin.includes = feature.xml | ||||
							
								
								
									
										67
									
								
								features/com.minres.scviewer.e4.feature/feature.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								features/com.minres.scviewer.e4.feature/feature.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <feature | ||||
|       id="com.minres.scviewer.e4.feature" | ||||
|       label="SCViewer Feature" | ||||
|       version="1.1.0.qualifier" | ||||
|       provider-name="MINRES Technologies GmbH"> | ||||
|  | ||||
|    <description url="http://www.example.com/description"> | ||||
|       [Enter Feature Description here.] | ||||
|    </description> | ||||
|  | ||||
|    <copyright url="http://www.example.com/copyright"> | ||||
|       [Enter Copyright Description here.] | ||||
|    </copyright> | ||||
|  | ||||
|    <license url="http://www.example.com/license"> | ||||
|       [Enter License Description here.] | ||||
|    </license> | ||||
|  | ||||
|    <url> | ||||
|       <update label="SC Viewer Updates" url="http://www.minres.com/scviewer/update"/> | ||||
|    </url> | ||||
|  | ||||
|    <requires> | ||||
|       <import plugin="javax.inject" version="1.0.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.core.runtime" version="3.11.1" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.swt" version="3.104.1" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.e4.ui.model.workbench" version="1.1.100" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.jface" version="3.11.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.e4.ui.services" version="1.2.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.e4.ui.workbench" version="1.3.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.e4.core.di" version="1.5.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.e4.ui.di" version="1.1.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.e4.core.contexts" version="1.4.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.osgi.services" version="3.5.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.e4.core.services" version="2.0.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.core.jobs"/> | ||||
|       <import plugin="org.eclipse.osgi"/> | ||||
|       <import plugin="org.eclipse.equinox.preferences"/> | ||||
|       <import plugin="org.eclipse.core.expressions"/> | ||||
|       <import plugin="org.eclipse.e4.core.commands" version="0.11.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.e4.core.di.extensions"/> | ||||
|       <import plugin="org.eclipse.e4.ui.css.swt.theme" version="0.10.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.core.resources" version="3.13.0" match="greaterOrEqual"/> | ||||
|       <import feature="com.opcoach.e4.preferences.feature" version="1.3.0.202004072127"/> | ||||
|       <import feature="org.eclipse.equinox.executable" version="3.8.700.v20200207-2156"/> | ||||
|       <import feature="org.eclipse.rcptt.core" version="2.5.1.M3"/> | ||||
|       <import plugin="org.eclipse.core.commands"/> | ||||
|       <import feature="com.minres.scviewer.database.feature" version="3.0.0.qualifier"/> | ||||
|       <import feature="com.minres.scviewer.ui.feature" version="1.1.0.qualifier"/> | ||||
|    </requires> | ||||
|  | ||||
|    <plugin | ||||
|          id="com.minres.scviewer.e4.application" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="com.opcoach.e4.preferences" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
| </feature> | ||||
							
								
								
									
										12
									
								
								features/com.minres.scviewer.e4.feature/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								features/com.minres.scviewer.e4.feature/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|   <modelVersion>4.0.0</modelVersion> | ||||
|   <artifactId>com.minres.scviewer.e4.feature</artifactId> | ||||
|   <packaging>eclipse-feature</packaging> | ||||
|   <parent> | ||||
|   	<groupId>com.minres.scviewer</groupId> | ||||
|   	<artifactId>com.minres.scviewer.parent</artifactId> | ||||
|   	<version>2.11.0</version> | ||||
| 	<relativePath>../..</relativePath> | ||||
|   </parent> | ||||
|   <version>1.1.0-SNAPSHOT</version> | ||||
| </project> | ||||
| @@ -1,2 +1 @@ | ||||
| /bin/ | ||||
| /target/ | ||||
							
								
								
									
										17
									
								
								features/com.minres.scviewer.e4.platform.feature/.project
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								features/com.minres.scviewer.e4.platform.feature/.project
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <projectDescription> | ||||
| 	<name>com.minres.scviewer.e4.platform.feature</name> | ||||
| 	<comment></comment> | ||||
| 	<projects> | ||||
| 	</projects> | ||||
| 	<buildSpec> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.pde.FeatureBuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 	</buildSpec> | ||||
| 	<natures> | ||||
| 		<nature>org.eclipse.pde.FeatureNature</nature> | ||||
| 	</natures> | ||||
| </projectDescription> | ||||
| @@ -0,0 +1 @@ | ||||
| bin.includes = feature.xml | ||||
							
								
								
									
										75
									
								
								features/com.minres.scviewer.e4.platform.feature/feature.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								features/com.minres.scviewer.e4.platform.feature/feature.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,75 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <feature | ||||
|       id="com.minres.scviewer.e4.platform.feature" | ||||
|       label="SCViewer Platform Feature" | ||||
|       version="1.0.0.qualifier" | ||||
|       provider-name="MINRES Technologies GmbH"> | ||||
|  | ||||
|    <description url="http://www.example.com/description"> | ||||
|       [Enter Feature Description here.] | ||||
|    </description> | ||||
|  | ||||
|    <copyright url="http://www.example.com/copyright"> | ||||
|       [Enter Copyright Description here.] | ||||
|    </copyright> | ||||
|  | ||||
|    <license url="http://www.example.com/license"> | ||||
|       [Enter License Description here.] | ||||
|    </license> | ||||
|  | ||||
|    <includes | ||||
|          id="org.eclipse.e4.rcp" | ||||
|          version="0.0.0"/> | ||||
|  | ||||
|    <includes | ||||
|          id="org.eclipse.emf.ecore" | ||||
|          version="0.0.0"/> | ||||
|  | ||||
|    <includes | ||||
|          id="org.eclipse.emf.common" | ||||
|          version="0.0.0"/> | ||||
|  | ||||
|    <requires> | ||||
|       <import plugin="org.eclipse.core.expressions" version="3.2.0" match="compatible"/> | ||||
|       <import plugin="org.eclipse.core.filesystem" version="1.3.0" match="compatible"/> | ||||
|       <import plugin="org.eclipse.core.runtime" version="3.12.0" match="compatible"/> | ||||
|       <import plugin="org.eclipse.equinox.common" version="3.2.0" match="compatible"/> | ||||
|       <import plugin="org.eclipse.equinox.registry" version="3.2.0" match="compatible"/> | ||||
|       <import plugin="org.eclipse.osgi" version="3.2.0" match="compatible"/> | ||||
|    </requires> | ||||
|  | ||||
|    <plugin | ||||
|          id="org.eclipse.core.resources" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="org.eclipse.core.filesystem" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="org.eclipse.core.filesystem.linux.x86_64" | ||||
|          os="linux" | ||||
|          arch="x86_64" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          fragment="true" | ||||
|          unpack="false"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="org.eclipse.core.filesystem.win32.x86_64" | ||||
|          os="win32" | ||||
|          arch="x86_64" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          fragment="true" | ||||
|          unpack="false"/> | ||||
|  | ||||
| </feature> | ||||
| @@ -1,13 +1,12 @@ | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|   <modelVersion>4.0.0</modelVersion> | ||||
|   <artifactId>com.opcoach.e4.preferences</artifactId> | ||||
|   <artifactId>com.minres.scviewer.e4.platform.feature</artifactId> | ||||
|   <packaging>eclipse-feature</packaging> | ||||
|   <parent> | ||||
|   	<groupId>com.minres.scviewer</groupId> | ||||
|   	<artifactId>com.minres.scviewer.parent</artifactId> | ||||
|   	<version>2.0.0-SNAPSHOT</version> | ||||
|   	<relativePath>../com.minres.scviewer.parent</relativePath> | ||||
|   	<version>2.11.0</version> | ||||
| 	<relativePath>../..</relativePath> | ||||
|   </parent> | ||||
|   <packaging>eclipse-plugin</packaging> | ||||
|   <version>1.0.0-SNAPSHOT</version> | ||||
|   <groupId>com.minres.scviewer</groupId> | ||||
| </project> | ||||
| </project> | ||||
| @@ -1,2 +1 @@ | ||||
| /target/ | ||||
| /bin/ | ||||
							
								
								
									
										4
									
								
								features/com.minres.scviewer.feature/build.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								features/com.minres.scviewer.feature/build.properties
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| bin.includes = feature.xml,\ | ||||
|                feature.properties | ||||
| src.includes = feature.properties,\ | ||||
|                feature.xml | ||||
							
								
								
									
										67
									
								
								features/com.minres.scviewer.feature/feature.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								features/com.minres.scviewer.feature/feature.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <feature | ||||
|       id="com.minres.scviewer.feature" | ||||
|       label="%featureName" | ||||
|       version="1.1.0.qualifier" | ||||
|       provider-name="%providerName"> | ||||
|  | ||||
|    <description> | ||||
|       A viewer for SystemC Verification Library transactions and VCD | ||||
| signals. It supports a SQLite based recording as well as the | ||||
| built-in text base recording. | ||||
|    </description> | ||||
|  | ||||
|    <copyright> | ||||
|       Copyright (c) 2015-2021 MINRES Technologies GmbH. | ||||
| All rights reserved. This program and the accompanying materials | ||||
| are made available under the terms of the Eclipse Public License | ||||
| v1.0 which accompanies this distribution, and is available at  | ||||
| http://www.eclipse.org/legal/epl-v10.html | ||||
|    </copyright> | ||||
|  | ||||
|    <license url="%licenseURL"> | ||||
|       %license | ||||
|    </license> | ||||
|  | ||||
|    <url> | ||||
|       <discovery label="MINRES Website" url="http://www.minres.com"/> | ||||
|    </url> | ||||
|  | ||||
|    <requires> | ||||
|       <import plugin="org.hamcrest.core" version="1.3.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.core.runtime"/> | ||||
|       <import plugin="org.eclipse.core.resources"/> | ||||
|       <import plugin="org.eclipse.jface.text"/> | ||||
|       <import plugin="org.eclipse.ui"/> | ||||
|       <import plugin="org.eclipse.ui.editors"/> | ||||
|       <import plugin="org.eclipse.ui.ide"/> | ||||
|       <import plugin="org.eclipse.ui.views.properties.tabbed"/> | ||||
|       <import plugin="org.eclipse.swt"/> | ||||
|       <import plugin="org.eclipse.osgi"/> | ||||
|       <import plugin="org.eclipse.core.expressions" version="3.4.600" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.jface"/> | ||||
|       <import feature="com.minres.scviewer.database.feature" version="3.0.0.qualifier"/> | ||||
|       <import feature="com.minres.scviewer.ui.feature" version="1.1.0.qualifier"/> | ||||
|    </requires> | ||||
|  | ||||
|    <plugin | ||||
|          id="org.junit" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="org.hamcrest.core" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="com.minres.scviewer.ui" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
| </feature> | ||||
| @@ -5,8 +5,8 @@ | ||||
|   <parent> | ||||
|   	<groupId>com.minres.scviewer</groupId> | ||||
|   	<artifactId>com.minres.scviewer.parent</artifactId> | ||||
|   	<version>2.0.0-SNAPSHOT</version> | ||||
|   	<relativePath>../com.minres.scviewer.parent</relativePath> | ||||
|   	<version>2.11.0</version> | ||||
| 	<relativePath>../..</relativePath> | ||||
|   </parent> | ||||
|   <version>1.0.0-SNAPSHOT</version> | ||||
| </project> | ||||
|   <version>1.1.0-SNAPSHOT</version> | ||||
| </project> | ||||
							
								
								
									
										1
									
								
								features/com.minres.scviewer.ui.feature/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								features/com.minres.scviewer.ui.feature/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| /target/ | ||||
							
								
								
									
										17
									
								
								features/com.minres.scviewer.ui.feature/.project
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								features/com.minres.scviewer.ui.feature/.project
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <projectDescription> | ||||
| 	<name>com.minres.scviewer.ui.feature</name> | ||||
| 	<comment></comment> | ||||
| 	<projects> | ||||
| 	</projects> | ||||
| 	<buildSpec> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.pde.FeatureBuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 	</buildSpec> | ||||
| 	<natures> | ||||
| 		<nature>org.eclipse.pde.FeatureNature</nature> | ||||
| 	</natures> | ||||
| </projectDescription> | ||||
							
								
								
									
										4
									
								
								features/com.minres.scviewer.ui.feature/build.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								features/com.minres.scviewer.ui.feature/build.properties
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| bin.includes = feature.xml,\ | ||||
|                feature.properties | ||||
| src.includes = feature.properties,\ | ||||
|                feature.xml | ||||
							
								
								
									
										102
									
								
								features/com.minres.scviewer.ui.feature/feature.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								features/com.minres.scviewer.ui.feature/feature.properties
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,102 @@ | ||||
| featureName=SCViewer UI elements | ||||
| providerName=MINRES Technologies GmbH | ||||
| updateSiteName=SC Viewer UI Updates | ||||
| description=A viewer for SystemC Verification Library transactions and VCD signals. | ||||
| licenseURL=license.html | ||||
| license=\ | ||||
| ECLIPSE FOUNDATION SOFTWARE USER AGREEMENT\n\ | ||||
| March 17, 2005\n\ | ||||
| \n\ | ||||
| Usage Of Content\n\ | ||||
| \n\ | ||||
| THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\ | ||||
| OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\ | ||||
| USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\ | ||||
| AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\ | ||||
| NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\ | ||||
| AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\ | ||||
| AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\ | ||||
| OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\ | ||||
| TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\ | ||||
| OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\ | ||||
| BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\ | ||||
| \n\ | ||||
| Applicable Licenses\n\ | ||||
| \n\ | ||||
| Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\ | ||||
| is provided to you under the terms and conditions of the Eclipse Public\n\ | ||||
| License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\ | ||||
| Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\ | ||||
| For purposes of the EPL, "Program" will mean the Content.\n\ | ||||
| \n\ | ||||
| Content includes, but is not limited to, source code, object code,\n\ | ||||
| documentation and other files maintained in the Eclipse.org CVS\n\ | ||||
| repository ("Repository") in CVS modules ("Modules") and made available\n\ | ||||
| as downloadable archives ("Downloads").\n\ | ||||
| \n\ | ||||
|    - Content may be structured and packaged into modules to facilitate delivering,\n\ | ||||
|      extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\ | ||||
|      plug-in fragments ("Fragments"), and features ("Features").\n\ | ||||
|    - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\ | ||||
|      in a directory named "plugins".\n\ | ||||
|    - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\ | ||||
|      Each Feature may be packaged as a sub-directory in a directory named "features".\n\ | ||||
|      Within a Feature, files named "feature.xml" may contain a list of the names and version\n\ | ||||
|      numbers of the Plug-ins and/or Fragments associated with that Feature.\n\ | ||||
|    - Features may also include other Features ("Included Features"). Within a Feature, files\n\ | ||||
|      named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\ | ||||
| \n\ | ||||
| Features may also include other Features ("Included Features"). Files named\n\ | ||||
| "feature.xml" may contain a list of the names and version numbers of\n\ | ||||
| Included Features.\n\ | ||||
| \n\ | ||||
| The terms and conditions governing Plug-ins and Fragments should be\n\ | ||||
| contained in files named "about.html" ("Abouts"). The terms and\n\ | ||||
| conditions governing Features and Included Features should be contained\n\ | ||||
| in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\ | ||||
| Licenses may be located in any directory of a Download or Module\n\ | ||||
| including, but not limited to the following locations:\n\ | ||||
| \n\ | ||||
|    - The top-level (root) directory\n\ | ||||
|    - Plug-in and Fragment directories\n\ | ||||
|    - Inside Plug-ins and Fragments packaged as JARs\n\ | ||||
|    - Sub-directories of the directory named "src" of certain Plug-ins\n\ | ||||
|    - Feature directories\n\ | ||||
| \n\ | ||||
| Note: if a Feature made available by the Eclipse Foundation is installed using the\n\ | ||||
| Eclipse Update Manager, you must agree to a license ("Feature Update\n\ | ||||
| License") during the installation process. If the Feature contains\n\ | ||||
| Included Features, the Feature Update License should either provide you\n\ | ||||
| with the terms and conditions governing the Included Features or inform\n\ | ||||
| you where you can locate them. Feature Update Licenses may be found in\n\ | ||||
| the "license" property of files named "feature.properties". Such Abouts,\n\ | ||||
| Feature Licenses and Feature Update Licenses contain the terms and\n\ | ||||
| conditions (or references to such terms and conditions) that govern your\n\ | ||||
| use of the associated Content in that directory.\n\ | ||||
| \n\ | ||||
| THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER\n\ | ||||
| TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\ | ||||
| SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\ | ||||
| \n\ | ||||
|     - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\ | ||||
|     - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\ | ||||
|     - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\ | ||||
|     - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\ | ||||
|     - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\ | ||||
|     - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\ | ||||
| \n\ | ||||
| IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\ | ||||
| TO USE OF THE CONTENT. If no About, Feature License or Feature Update License\n\ | ||||
| is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\ | ||||
| govern that particular Content.\n\ | ||||
| \n\ | ||||
| Cryptography\n\ | ||||
| \n\ | ||||
| Content may contain encryption software. The country in which you are\n\ | ||||
| currently may have restrictions on the import, possession, and use,\n\ | ||||
| and/or re-export to another country, of encryption software. BEFORE\n\ | ||||
| using any encryption software, please check the country's laws,\n\ | ||||
| regulations and policies concerning the import, possession, or use,\n\ | ||||
| and re-export of encryption software, to see if this is permitted.\n\ | ||||
| \n\ | ||||
| Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n | ||||
							
								
								
									
										44
									
								
								features/com.minres.scviewer.ui.feature/feature.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								features/com.minres.scviewer.ui.feature/feature.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <feature | ||||
|       id="com.minres.scviewer.ui.feature" | ||||
|       label="%featureName" | ||||
|       version="1.1.0.qualifier" | ||||
|       provider-name="%providerName"> | ||||
|  | ||||
|    <description> | ||||
|       The UI for the SCViewer databases | ||||
|    </description> | ||||
|  | ||||
|    <copyright> | ||||
|       Copyright (c) 2015-2021 MINRES Technologies GmbH. | ||||
| All rights reserved. This program and the accompanying materials | ||||
| are made available under the terms of the Eclipse Public License | ||||
| v1.0 which accompanies this distribution, and is available at | ||||
| http://www.eclipse.org/legal/epl-v10.html | ||||
|    </copyright> | ||||
|  | ||||
|    <license url="%licenseURL"> | ||||
|       %license | ||||
|    </license> | ||||
|  | ||||
|    <url> | ||||
|       <discovery label="MINRES Website" url="http://www.minres.com"/> | ||||
|    </url> | ||||
|  | ||||
|    <requires> | ||||
|       <import plugin="org.eclipse.swt" version="3.103.1" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.jface"/> | ||||
|       <import plugin="org.eclipse.equinox.registry"/> | ||||
|       <import plugin="org.eclipse.core.runtime"/> | ||||
|       <import plugin="org.eclipse.osgi"/> | ||||
|       <import feature="com.minres.scviewer.database.feature" version="3.0.0.qualifier"/> | ||||
|    </requires> | ||||
|  | ||||
|    <plugin | ||||
|          id="com.minres.scviewer.database.ui.swt" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
| </feature> | ||||
							
								
								
									
										12
									
								
								features/com.minres.scviewer.ui.feature/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								features/com.minres.scviewer.ui.feature/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|   <modelVersion>4.0.0</modelVersion> | ||||
|   <artifactId>com.minres.scviewer.ui.feature</artifactId> | ||||
|   <packaging>eclipse-feature</packaging> | ||||
|   <parent> | ||||
|   	<groupId>com.minres.scviewer</groupId> | ||||
|   	<artifactId>com.minres.scviewer.parent</artifactId> | ||||
|   	<version>2.11.0</version> | ||||
| 	<relativePath>../..</relativePath> | ||||
|   </parent> | ||||
|   <version>1.1.0-SNAPSHOT</version> | ||||
| </project> | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user