OPENEN VAN HET PROGRAMMA

Manifest-Version: 1.0
Main-Class: framePackage.Program

Volgorde bij start is van belang: eerst logpanel, want bij importeren van preferences wordt log gebruikt
Dan preferences, want daarin staat in welke taal het programma moet openen, en welke akoestische berekening.

_logPanel = new LogPanel();
preferences = new Preferences();
ImportDatabase.getPreferences(preferences); 
	<- /dataPackage/lang.txt	mainLanguage=NL  version=2.0
	<- Home/..Ventilation/PreferencesNL.txt
	file=/home/jan/test6.ven	language=NL
	
dossier = new Dossier();
parameters = new Parameters();
ImportDatabase.getParameters(parameters);   <- Home/..Ventilation/Parameters.txt
	panelWidth,panelHeight,panelDept,speedLowIn,speedLowOut,speedMiddleIn,speedMiddleOut,
	speedHighIn,speedHighOut,maxPressureDrop,balance,
	Install_name,Install_street,Install_municipality,Install_vat,
	Metering_name,Metering_street,Metering_municipality,Metering_vat
	
_databasePanel = new DatabasePanel();
	_table = new DatabaseTable(this);
		_data = new ImportDatabase().getComponentList();
			[version=1]
			[date=17/05/2013]
			[properties]
			user;typeNL;typeFR;nameNL;nameFR;boreIn;boreOut;bore3;angle;C;n;C_valve;n_valve;brand
			user = DATA_NONE = 0, DATA_TITLE = 1, DATA_BASE = 2, DATA_USER = 4, DATA_DEFAULT = 8, DATA_FIXED = 16
			(1 = tussentitel, 10 = database + default, 26 = database + default + fixed)
		setExtraComponents(new ImportDatabase().getExtraComponents());  <- Home/..Ventilation/Components.csv
			user;typeNL;typeFR;nameNL;nameFR;boreIn;boreOut;bore3;angle;C;n;C_valve;n_valve;brand
			(4 = user defined, 12 = user + default)
			
MyOptionPane.setOptions();JOptionpane, save en open dialogen in Nederlands
---------------------------------------------------------------------------------------------------------
OPENEN VAN EEN VEN-BESTAND

if (SAVE_OK != 0)	Wil je het geopende dossier opslaan?
Ventilatie temp = ImportVentilationFile.importVentilation();
	[DOSSIER] -> decodeDossier
	[ROOMS] -> decodeRooms
	[PASSIVE COMPS] -> decodePassiveComps
	[COMPONENTS FLOWIN] -> decodeComponents
	[COMPONENTS FLOWOUT] -> decodeComponents
	[COLLECTOR TRACES] -> decodeCollectorTraces
	[USER DEFINED COMPONENTS] -> decodeUserDefinedExtraItems
	[COMPONENTS ACOUSTICS PROPERTIES] -> decodeAcousticProperties
	[METERING FLOWIN] -> decodeMetering
	[METERING FLOWOUT] -> decodeMetering
	[METERING RECIRC -> decodeMetering
	[PARAMETERS] -> Program.parameters.decodeParameters
	[DEFAULT COMPONENTS] -> decodeDefaultComponents
		Database.fireTableDataChanged()
	[DEFAULT PASSIVE COMPONENTS] -> decodeDefaultComponents
if (temp != null)	
	FILENAME = true;
	_ventilatie = temp;
	Vul zo nodig de database aan met componenten uit de file
	if (Database().setExtraComponents(_ventilatie.getFlowInComponentList()) > 0 ||
			Database().setExtraComponents(_ventilatie.getFlowOutComponentList()) > 0)
		Database().fireTableDataChanged();
----------------------------------------------------------------------------------------------------------
OPSLAAN VAN EEN VEN-BESTAND

if (ExportVentilationFile.exportVentilation(ventilatie, !FILENAME (=toonFileDialog))) 
		transformHeader(out);
		
		Program.dossier.write(out, 0);				Dossier_client, Client_name, Client_street, Client_municipality,
													Ventilation_type
		transformRooms(out, ventilatie);			foreach room: room.getProperties()
			type;name;surface;designIn;boreIn;designOut;boreOut;parentRoom;valveCount;recircCount;component
		transformPassiveComps(out, ventilatie);

		transformComponentsIn(out, ventilatie);		foreach component: component.getProperties()
			user;typeNL;nameNL;nameFR;boreIn;boreOut;bore3;angle;C;n;C_valve;n_valve;brand;start;end;room
		transformComponentsOut(out, ventilatie);	foreach component: component.getProperties()
		transformCollectorTraces(out, ventilatie);
		transformAcousticsProperties(out, ventilatie);
		transformUserDefinedItems(out, ventilatie);

		transformMetering(out, FlowType.IN);		Program.getVentilatie().getAdjustData(FlowType.IN)
													foreach room: adjustRooms -> name, metering 1, 2 en 3
		transformMetering(out, FlowType.OUT);		Program.getVentilatie().getAdjustData(FlowType.OUT)
													foreach room: adjustRooms -> name, metering 1, 2 en 3
		transformMetering(out, FlowType.RECIRC);
		Program.parameters.write(out, 0);			panelWidth,panelHeight,panelDept,speedLowIn,speedLowOut,
													speedMiddleIn,speedMiddleOut,speedHighIn,speedHighOut,maxPressureDrop,balance
		
		transformDefaultComponents(out, Datatype.ACTIVE);	foreach Program.getDatabase().getDefaultData -> name + brand
		transformDefaultComponents(out, Datatype.PASSIVE);
		transformLogger(out);
					
		Program.FILENAME = true;
	setSaveOk(true);
------------------------------------------------------------------------------------------------------------
INVOEREN VAN EEN COMPONENT

GridPanel.mouseReleased.addComponent(null) -> new VComponent(type.KANAAL, start, end)
GridPanel.breakComponent() -> addComponent(component.copy( clone, breakpoint = start)
EndComponentDialog.gridPanel.addEndComponent(new EComponent(flow, room, component))
					component.setPoint(start, end)
TraceNet.setConnections().addComponent(newComp)
					new BComponent(): start, end, angle, realAngle, pointIn, pointOut, compIn, compOut
					new TComponent(): start, end, angle, realAngle, pointLat, point1, point2,
										compLat, compRec1, compRec2
	
WIJZIGEN VAN EEN COMPONENT
	
Ventilatie.(re)calculateVentilation -> TraceNet.setBoresOfTubes
		setDatabaseComponent: user, name, brand, boreIn, boreOut, C, n, valveC, valveN	
								-> TraceList.setDatabaseConnections	
		setDatabaseBComponent: user, name, brand, boreIn, boreOut, C, n		
		setDatabaseTComponent: user, name, brand	
			
PropertiesPanel: name.ComboBoxListener 
	-> GridPanel.changeSelectedComponent(component)
					selectedComponent.setProperties(component): user, merk, naam, diameter, C en n
	-> multiselection: GridPanel.changeSelectedComponents(component)
			hetzelfde type: foreach selectComp.setProperties(component): user, merk, naam, diameter, C en n
			o.a. buizen: foreach selectComp.isTube()  setProperties(component): user, merk, naam, diameter, C en n
				ook ventiel: foreach endComp.setProperties(component): user, merk, naam, diameter, C, n, C', n'
					
INITIELE BEREKENING  calculateVentilation
	removeIdenticalComponents();	-> Verwijdert componenten waarvan begin- en eindpunt samenvallen
	removeConversions(true);		-> Verwijdert alle reducties/verwijdingen 
	setDirectionOfPipes();			-> Wisselt onderling begin- en eindpunt, indien nodig
	checkComponentConnection() 		-> Waarschuwt als een component niet verbonden is met een andere component
	checkEndComponentConnections() 	-> Waarschuwt als een eindcomponent (ventiel, rooster) 
										verbonden is met meerdere kanalen
	setConnections() 				-> Verbindt kanalen met T-stukken en bochten (met pointers naar de aansluitingen)

	setTraces() 					-> Maakt de lijst met tracés op
	isFlowAllConnected(roomList) 	-> gaat na of alle ventielen verbonden zijn met de ventilator
	setBoresOfPipesOrEComponents(roomList, true) -> Stelt de diameters van de kanalen in en zoekt 
										een overeenkomstig component in de database
	setDatabaseConnections(true) 	-> Zoekt in de database overeenkomstige bochten en T-stukken
	setConversions();				-> Controleert bij alle tracés de aansluitingen tussen de componenten: 
	 									diameters verschillen -> reductie/verijding er tussen 
	computePressureDrop(roomList) 	-> Berekent de drukval van de tracés


HERBEREKENING: reCalculateVentilation
	removeIdenticalComponents();
	removeConversions(false);		-> Verwijdert de overtollige reducties/verwijdingen (welke niet vebonden aan beide zijden)
	setDirectionOfPipes();
	if (component != null && !component.isConnection()) {
		setDirectionOfPipe(component);
		checkBoresOfConnections(component);
	}								-> Controleert of de aansluitende bochten of T-stukken de juiste diameter hebben
	 									en vervangt die door een juiste uit de database (indien beschikbaar)
	setConnections();				-> Nieuwe bochten en T-stukken krijgen diameter 0 (zie verder)
	setTraces();
	isFlowAllConnected(roomList);
	setBoresOfPipesOrEComponents(roomList, false);-> Stelt de diameters van de kanalen met diameter 0 in 
										en zoekt een overeenkomstig component in de database
	setDatabaseConnections(false);	-> Zoekt in de database overeenkomstige bochten en T-stukken voor bochten
										en T-stukken waarvan de diameter 0 is
	setConversions();
	computePressureDrop(roomList);
		
--------------------------------------------------------------------------------------------------------------
REDUCTIES/VERWIJDINGEN

Bij de startberekening staan er nooit reducties tussen buizen of tussen buis en bocht.
Als een buis gewijzigd wordt van diameter wordt de methode 'reCalculateVentilation(buis)' uitgevoerd, 
met 'checkBoresOfConnections(buis)'
- er wordt in de database een passend T-stuk gezocht (wordt in principe altijd gevonden)
	uitzondering: niet logische tracés: bv. T-stuk 100 200 160
- of er wordt een passende bocht gezocht (NU: bocht met de diameter van de dikste aansluitende buis).
-------------------------------------------------------------------------------------------------------------
AFSTELLEN VENTILATIE

Dat kan gebeuren in het AdjustPanel.
In het AdjustPanel worden verschillende AdjustTable's gemaakt.
De data in zo'n tabel wordt gevormd door AdjustData met een array van AdjustRoom's.
AdjustRoom heeft een pointer naar een VRoom, de floats metering en de hulp-floats claimApprox 
(benaderende eis bij ventielen waarvan er meer in één ruimte zijn), calculate, 
de booleans claimOK en designOK en een int ordening.			

--------------------------------------------------------------------------------------------------------------
EIGENSCHAPPENVENSTER (PropertiesPanel)

Als een component geselecteerd wordt: bij mouseReleased -> propertiesPanel.setComponentListInfo(selectieList)		
De selectieList bestaat uit 1 of meerdere componenten (bij mousePressed en !isControlDown wordt de list 
leeggemaakt), mouseReleased zonder verplaatsing voegt een component toe aan de lijst.

In de popup kan gekozen worden voor selectCurrentKanaalstuk. 
De selectielijst wordt dan gevuld met componenten (niet in volgorde) van de aftakking tot aftakking of 
eindventiel -> propertiesPanel.setComponentListInfo(selectieList)

Op een component klikken in de WarningDialog zorgt ook voor het selecteren van de component en voor het tonen
van de eigenschappen -> propertiesPanel.setComponentListInfo(selectieList)
			
Als componenten toegevoegd, verwijderd of verplaatst worden -> propertiesPanel.setComponentInfo(component)
De 2 vorige methoden roepen allebei de functie aan:
   -> setComponentInfo(component,changeCombobox, enableComboBox)
   		-> als geen component geselecteerd is worden de tekstvakken leeg gemaakt en de comboboxen gedeactiveerd
   		-> als meerdere componenten worden geselecteerd worden de comboboxen geactiveerd
   		-> als een kanaalstuk wordt geselecteerd worden debiet, diameter, snelheid getoond
   		-> bij enkelvoedige selectie worden alle relevante tekstvakken gevuld

---------------------------------------------------------------------------------------------------------------
DATAMANAGERDIALOG

Bij het starten van het programma worden 2 arraylists aangemaakt voor de merken '_brandListActive'(voor de
actieve compnenten) en '_brandListPassive' (voor de passieve componenten) en worden gevuld met merken uit 
Ventilation/Brands.txt.
Bij het importeren van de database uit de jar wordt het merk daaruit in de lists ingevoegd.
Bij het importeren van Components.csv (niet-generieke compnenten) wordt de lijst niet aangevuld.
Bij het openen van de dialoog 'Beheer databank' wordt de database doorlopen op merken + merken uit _brandList.
Bij het importeren van een extern (merk)bestand met componenten wordt de merkenlijst aangevuld met dit merk.
Bij het verwijderen ven een merk wordt het merk uit de merkenlijst gehaald.

Als een component handmatig ingevoegd wordt in de database, zal die niet opgeslaan zijn na het sluiten.
Tenzij het via de dialog wordt 'Opgeslaan voor toekomstige dossiers' is gebeurd.
Als de component in het dossier wordt gebruikt in toevoer of afvoer, zal bij het heropenen van het dossier, 
de component terug in de database ingevoegd worden. 
Dit gebeurt niet als de component enkel in de bestellijst wordt ingevoegd.

Als wijzigingen in het dialoogvenster gesaved worden (opslaan voor toekomstige dossiers) dan wordt met
ExportDatabase.saveDatabase() de bestanden Components.csv of PassiveComponents.csv (niet-generieke componenten)
en Brands.txt (merken uit de merkenlijst:  _brandList(Active)) opgeslaan. 
Ook worden (saveGeneric = true) de generieke elementen met voorkeur opgeslaan in ComponentsGeneric.txt
of PassiveComponentsGeneric.txt. 
Als de wijzigingen geanuleerd worden of als na het sluiten 'undo' wordt gekozen, worden de wijzigingen
ongedaan gemaakt, en als in de dialoog gesaved was, wordt weer alles weggeschreven naar de 3 bestanden.


--------------------------------------------------------------------------------------------------------
BREEK KANAALSTUK
Selecteer een lijn of buis. Rechtsklik op het middelpunt, kies in het contextmenu voor 'Breek kanaalstuk'.
Klik op het middelpunt, verschuif (of niet) en los de muisknop.
MousePressed(): _pressSelectie =  getSelectedComponent(e.getX(), e.getY());
MouseReleased(): not dragging -> _releaseSelectie = getSelectedComponent(e.getX(), e.getY());
		addToSelectieList(_releaseSelectie);
MousePressed(): _pressPoint2D = new Point(e.getX(), e.getY());
		rechter muisknop -> _popupMenu.show();
Kies 'Breek kanaalstuk' (_releaseSelectie != null) -> 	getBreakPoint(_pressPoint2D.x, _pressPoint2D.y);
							_breakingProcess = true;

MousePressed(): (_releasePoint3D = null)
MouseDragged(): if (_breakingProcess)	_breakPoint2D = getBreakPoint(e.getX(), e.getY());
		(getBreakPoint() stelt _breakPointSnap in en retourneert het snappunt)
		(met _breakPoint2D wordt een drag-punt getekend)
MousReleased(): breakComponent() -> een breakPoint3D wordt berekend met de _breakPointSnap
		en het lijnstuk wordt in 2 delen verdeeld
		
-------------------------------------------------------------------------------------------------------
COMPONENTEN SELECTEREN MET MUIS
MousePressed(): _pressSelectie =  getSelectedComponent(e.getX(), e.getY());
   	if (!isRightMouseButton(e) && !e.isShiftDown() && !e.isControlDown())
    			_selectieList.clear();
	_releasePoint3D = _pressSelectie.getPoint();
	repaintClip();
MousReleased(): if (e.isControlDown() || e.isShiftDown()) 
		ControlDown -> addToSelectieListOrRemove(_releaseSelectie)
			_releaseSelectie = getSelectedComponentSwitch(e.getX(), e.getY());
		ShiftDown -> addToSelectieList(_releaseSelectie)
			_releaseSelectie = getSelectedComponentSwitch(e.getX(), e.getY());
		Else -> _releaseSelectie = getSelectedComponent(e.getX(), e.getY());
			addToSelectieList(_releaseSelectie); -> voegt de selectie toe aan de selectielist
	repaintClip();
	
getSelectedComponentSwitch():
------------------------------------------------------------------------------------------------------
PAN		(klik naast component en verschuif)
MousePressed(): _currentSelectie =  getSelectedComponent(e.getX(), e.getY());
	if (_currentSelectie == null)  _panProcess = true;
MouseDragged():	if (_panProcess) setPan(_panPoint, e.getPoint());
MousReleased(): _panProcess = false;
------------------------------------------------------------------------------------------------------
De map Ventilation (komt in dezelfde map als het jar-bestand)
In die map 'Ventilation' kan zitten:
- PreferencesNL.txt (of FR in de Franse versie) met de taal waarin het programma moet openen en de voorkeur map om te openen of op te slaan
- Parameters.txt met de voorkeur parameters
- Brands.txt met de lijst van merken in de database en eventueel de laatste datum van opname van het merk in de database
- Components.csv en PassiveComponents.csv voor het opslaan van toegevoegde componenten in de database voor alle dossiers
- ComponentsGeneric.txt en PassiveComponentsGeneric.txt voor aan te geven welke de voorkeurcomponenten zijn (voor alle dossiers)
- UserComponents.txt en UserPassiveComponents.txt voor het opslaan van door de gebruiker aangemaakte componenten (voor alle dossiers)

In een Ven-bestand kan zitten, enkel van beland voor dit dossier:
- [PARAMETERS]
- [USER DEFINED COMPONENTS]
- [DEFAULT COMPONENTS]

Ik constateer dat ComponentsGeneric.txt eigenlijk ComponentsDefault.txt had moeten heten.
Ik constateer dat in het ven-bestand de voorkeur passieve componenten nog niet worden opgeslaan.
Ik constateer dat het invoegen van externe componenten niet wordt opgeslaan in het ven-bestand (tenzij ze in de tekening gebruikt worden).
	