Compare commits

..

123 Commits

Author SHA1 Message Date
e3e7bf5ccd Package script:
tar jar and run.sh
2021-01-11 02:34:41 +03:00
b386665e66 Simple run script for MacOS/Linux 2021-01-11 02:16:07 +03:00
5e1ff6451c Exit Button improved:
Exit button behaviour was just setting flags.
    This caused the program to set the exit flag when
    it is paused and wont exit until the unpause. Some other
    Funky stuff when the sim ends are fixed.
2021-01-05 17:11:43 +03:00
5be16de49f
Prevents OutOfMem (Heap) On my potato laptop. 2021-01-01 00:47:36 +03:00
f4bc812f23 After Sub fixes 2020-12-18 21:38:23 +03:00
f137b07c1e Min/Max for history 2020-12-18 14:57:06 +03:00
c07dc8a87c Fixes 2020-12-18 14:01:52 +03:00
Asaad Dadoush
f30a64a5b5 GUI edit report btn 2020-12-18 07:40:04 +03:00
Asaad Dadoush
dc12b51801 customize GUI 2020-12-18 07:23:06 +03:00
IMXHERO
1745db8700
Merge pull request #30 from AsaadDadoush/master
Add Action for Report btn
2020-12-17 23:25:29 +03:00
Asaad Dadoush
8085b5b951 Add Action for Report btn 2020-12-17 23:06:16 +03:00
EngOsamah
b9c0de4470
GUI_History (#29) 2020-12-17 21:20:32 +03:00
Asaad Dadoush
61f3fd63bd lbl arrived time for araft/hotles 2020-12-17 19:09:15 +03:00
d915e04832 Meeting fixes and new TODO 2020-12-17 14:27:11 +03:00
IMXHERO
67b313aabf
Merge pull request #28 from EngOsamah/master
d
2020-12-17 02:01:52 +03:00
EngOsamah
7e50caf26a a few changes 2020-12-17 01:13:14 +03:00
EngOsamah
1db0ce7ca7 Add toString to GUI_ViewBuses 2020-12-17 01:11:45 +03:00
EngOsamah
67c81d22d6 GUI_ViewRoute 2020-12-16 23:51:17 +03:00
HeshamTB
b3847bad78
Hist view size (#27) 2020-12-16 17:56:09 +03:00
HeshamTB
9cbb063af0
Merge pull request #26 from HeshamTB/browse-hist
Browse hist
2020-12-16 17:44:53 +03:00
a795117895 Hist view with states 2020-12-16 17:42:26 +03:00
9cf847ad46 DataManeger working save load 2020-12-16 16:51:45 +03:00
ab3acdec9b DataManeger:
- DataManeger is static global var in Makkah.
    - Save states in data/ dir.
    - Clear all bin files with constructor.
2020-12-16 16:26:40 +03:00
9a610b65e6 Imports block compile and eclipse project files 2020-12-16 15:58:46 +03:00
9280a5b4b3
WIP: Rework DataMan constructors.
Method to get all saved times.
    Not working.
2020-12-14 06:28:18 +03:00
270e89ee5b
Main view updates every Hour instead of min 2020-12-14 04:40:45 +03:00
HeshamTB
5143ae2891
Pause button and flag check in Checkinput() (#23) 2020-12-14 04:29:56 +03:00
EngOsamah
1d509a124f
GUI_ViewStreet done (#25) 2020-12-14 04:15:12 +03:00
EngOsamah
a695ead32d
Start GUI_ViewStreet class (#24)
Co-authored-by: HeshamTB <38921037+HeshamTB@users.noreply.github.com>
2020-12-11 16:40:25 +03:00
Asaad Dadoush
556dc27d9c edit buses table 2020-12-11 08:18:11 +03:00
ec5888cae2
Prevent exit on (x) ViewBuses and del fx test 2020-12-11 06:31:38 +03:00
HeshamTB
75667bfa10
Merge pull request #22 from EngOsamah/master
GUI_ViewBuses
2020-12-11 06:29:03 +03:00
EngOsamah
f517b8ea00 GUI_ViewBuses 2020-12-11 05:35:18 +03:00
Asaad Dadoush
1b137dce3b new Class for show the buses 2020-12-10 22:19:30 +03:00
Asaad Dadoush
f397003d32 Event for btnHistory(undone)! 2020-12-09 23:29:06 +03:00
Asaad Dadoush
938ffa9b69 organize the code 2020-12-09 22:53:08 +03:00
Asaad Dadoush
73ff93b32a Osamah : Added new Frame to btn View Busses and new class GUI_ViewBuses
some rework in the GUI interface
2020-12-09 22:35:24 +03:00
Asaad Dadoush
f1010ff184 TODO Arrival Time For Each Day 2020-12-09 09:13:41 +03:00
Asaad Dadoush
08f19fd60f Edit GUI 2020-12-09 08:51:54 +03:00
Asaad Dadoush
8656da255a GUI Edit 2020-12-09 08:35:06 +03:00
Asaad Dadoush
9988c9d205 TODO avg for all the Dist 2020-12-09 08:26:53 +03:00
Asaad Dadoush
8df3814395 lbl For Average Trip For Last Hour Value 2020-12-09 08:13:46 +03:00
Asaad Dadoush
309c83d582 lbl Maximum Trip + lbl Minimum Trip 2020-12-09 08:01:39 +03:00
Asaad Dadoush
34c06d2fb0 null Solved 2020-12-09 07:41:24 +03:00
Asaad Dadoush
47e6ffb30f Null Exception why ???? check TODO list in line 1142 2020-12-09 04:45:13 +03:00
Asaad Dadoush
36e44ceab6 add lbl for number of buses + edit district table 2020-12-09 04:05:47 +03:00
Asaad Dadoush
6b7f7eee11 Add Action for ViewRoutes 2020-12-09 01:26:32 +03:00
IMXHERO
4a5b9cf964
Merge pull request #21 from HeshamTB/history-bin
History bin
2020-12-09 01:00:52 +03:00
IMXHERO
89f7946f98
Merge branch 'master' into history-bin 2020-12-09 01:00:28 +03:00
Asaad Dadoush
c5c89e30e8 phase2 sol + frame Color + update the table 2020-12-09 00:56:13 +03:00
Asaad Dadoush
afb8f0982c Add new Table for district 2020-12-08 11:46:58 +03:00
e14ed99d42
Exit Button 2020-12-07 22:33:27 +03:00
54421ee9e6
StreetsFrame/Table (Live updating):
- Move code to GUI inter class.
    - The table updates every minute
2020-12-07 22:18:39 +03:00
HeshamTB
5ab60978dc
Merge pull request #20 from HeshamTB/swing-test
Swing test
2020-12-07 21:50:40 +03:00
HeshamTB
add1264e01
Merge branch 'master' into swing-test 2020-12-07 21:50:25 +03:00
Asaad Dadoush
bb17d9180e edit some swing 2020-12-07 11:13:37 +03:00
Asaad Dadoush
192a482bb4 edit some swing 2020-12-07 11:12:23 +03:00
Asaad Dadoush
7d5f3452ad GUI Woring heeeeeeeee :D 2020-12-07 11:01:20 +03:00
6648832d50
Prevent overwrite of arrival times 2020-12-07 05:15:36 +03:00
72eba421db
Typo 2020-12-07 04:49:32 +03:00
13f46c84dc
GUI nested class to setup for swing GUI 2020-12-07 04:46:51 +03:00
HeshamTB
f06614c390
Merge pull request #18 from EngOsamah/master
Distribute the Buses
2020-12-07 04:46:35 +03:00
da959a5cd3
simple Street table 2020-12-07 03:24:46 +03:00
EngOsamah
b88a33a749 Distribute the Buses 2020-12-07 02:05:51 +03:00
6720b412e6
Typo 2020-12-06 23:03:06 +03:00
HeshamTB
20296571fc
Merge pull request #16 from AsaadDadoush/master
First GUI test
2020-12-06 22:33:38 +03:00
HeshamTB
50e348de8d
Merge pull request #15 from EngOsamah/master
shuffle
2020-12-06 22:31:56 +03:00
Asaad Dadoush
4b9c5a8544 First GUI test 2020-12-06 22:21:50 +03:00
414cf44dae
Load history menu option:
- Browse is still incomplete.
	- There is a bug when selecting a time before the hour 12.
	The time becomes 23:00 ?
2020-12-06 05:38:39 +03:00
53dc294cf1
ignore bin extention 2020-12-06 05:37:54 +03:00
147d45e4fe
DataMan and State:
- Save state of given time.

    Still not tested with recovering saved
    states.
2020-12-06 04:07:49 +03:00
EngOsamah
ee1cb4852c Tasks 2020-12-05 23:54:01 +03:00
EngOsamah
4d736bc21c Shuffle Campaigns 2020-12-05 23:03:09 +03:00
cebf2a272b
ignore 2020-12-05 10:50:14 +03:00
709fa9bdac
show capacity next to street name (menu) 2020-12-04 09:10:43 +03:00
a106c5fc2f
Campaign menu option 2020-12-04 08:59:08 +03:00
5f3488c4d0
improved Vehicle output 2020-12-04 08:34:55 +03:00
0e4f871770
Pause inputListner at end of sim:
- This prevents displaying a menu and
	all the input is taken by the input
	thread. In such case, the user can't
	use the menu or exit normally.
2020-12-03 03:36:59 +03:00
787d2a7fd7
Revert capacity() 2020-12-03 03:19:25 +03:00
8bb64bea64
Reset all time members of vehicle:
- Reset (nullify) all times
   when a new route is set.

   Fixes a bug where there is a trip
   time when in second day and still
   has not arrived.
2020-12-03 02:58:54 +03:00
024babaf3f
Extend second day to allow for all buses to arrive 2020-12-03 02:43:13 +03:00
3932f8758c Add Trip time and progress to vehicle output
Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-12-02 20:32:40 +03:00
f4007d7007 Terminate thread when done
Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-12-02 19:24:56 +03:00
810820283f final patch before P1
Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-12-02 19:22:18 +03:00
c7313cd3df Improved output
Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-12-02 19:06:37 +03:00
22ee69be52 Fixed cast error
Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-12-02 18:29:24 +03:00
b6003cc3e8
Add distance to Vehicle toString()
Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-12-02 17:43:05 +03:00
HeshamTB
af92fb96e0
Merge pull request #14 from EngOsamah/master
Phase 1
2020-12-02 17:37:37 +03:00
EngOsamah
2f14faa2eb Phase 1 2020-12-02 13:52:11 +03:00
6dbe6a331f
Update menu:
- View buses instead of vehicles.
    - showVehicle option menu.

Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-12-02 03:01:01 +03:00
afb2b85643
Clean up
Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-12-02 02:17:07 +03:00
177e22ef13
Merge branch 'menu' 2020-12-02 02:03:29 +03:00
de91dd6cc4
Merge branch 'menu' of https://github.com/HeshamTB/Hajj-simulation into menu 2020-12-02 01:51:00 +03:00
a0d4fdf9f6
Hijri representation (HijriDate):
- Override Date toString()
    to replace 'Jan' with Dhu'l-Hijja
    and other values.
    - PDate returns instances of HijriDate
    that return Hijri Strings.

Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-12-02 01:46:56 +03:00
d4be36ebf8
Travelable interface
Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-12-02 00:50:18 +03:00
35ce9ca754
District report evey hour 2-12-2020 meeting
Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-12-02 00:49:45 +03:00
271395654c
Route used by
Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-12-02 00:02:08 +03:00
19291fbfe1
District report:
- Add best time to dist

Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-12-01 22:33:24 +03:00
ba02114562
Print time of finishing for both days
Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-12-01 22:21:50 +03:00
a376d91671
Clean up
Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-12-01 21:10:00 +03:00
4a87e08a74
busses arrived per hour fix
Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-12-01 20:51:12 +03:00
336106c7ed
Street toString()
- Print street details and fields.
    - Print scaled street density.
2020-12-01 20:22:59 +03:00
Asaad Dadoush
86651b3a91 method for the bus arrived per hour 2020-12-01 19:05:27 +03:00
HeshamTB
83261572fb
Merge branch 'master' into menu 2020-12-01 06:56:31 +03:00
HeshamTB
16195f44cc
Merge pull request #12 from EngOsamah/master
CivilVehicleNoise is OK
2020-12-01 06:34:45 +03:00
3e1af27b6d
Print report option in menu
Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-12-01 04:58:26 +03:00
EngOsamah
e8cdb4b51d CivilVehicleNoise is OK 2020-12-01 00:26:05 +03:00
51bf50ec6d
menu split into methods:
- Stack-like menu. Recurse until
    Return is selected.

Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-12-01 00:24:24 +03:00
0b4e259495
Route toString() Exception fix:
- toString() throws exception
   when invoked on 'noise' vehicles
   The routes made for them dont have
   District and Mashier set. Accessing
   name() from a null method throws
   null ptr ex.

Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-12-01 00:23:07 +03:00
e28a593280
Print time with menu
Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-11-30 22:42:09 +03:00
fbd39f4081
Street history
- Save time of entry for each vehicle

Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-11-30 22:36:37 +03:00
3a91f2f0f1
Vehicle toString():
- Print route
    - Check if street is null before getting
        name.

Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-11-30 21:47:33 +03:00
d7e3fd7a68
Vehicle toString()
Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-11-30 21:05:01 +03:00
2edf82b28b
menu:
- Added street option in menu
    - Street length printed to second

Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-11-30 20:50:23 +03:00
076cb510cf
Merge branch 'master' into menu 2020-11-30 20:28:42 +03:00
680890b864
Street toString()
- Print street details and fields.
    - Print scaled street density.
2020-11-30 20:11:41 +03:00
c3485f94d1
Merge branch 'master' into menu 2020-11-30 18:48:34 +03:00
521b36a117
Fix output glitch
Signed-off-by: HeshamTB <hishaminv@gmail.com>
2020-11-28 05:42:21 +03:00
fc05264a46
Menu functions (Exit, Continue) 2020-11-27 20:04:23 +03:00
4346b9348d
Menu functions:
- View Vehicles
    - View Routes
2020-11-27 19:18:44 +03:00
b85a4040f2
Simple menu. Does nothing. 2020-11-27 18:42:17 +03:00
6d3d3b5085
Add pause method in InputListener
- Pause method and var to stop
    Scanner from 'taking' the input
    when in menue.
2020-11-27 18:42:17 +03:00
bd68322a75
Start a thread to listen for console input
- Listen for 'commands' on stdin
    the thread is running alongside
    the simulation.
2020-11-27 18:42:16 +03:00
25 changed files with 2800 additions and 198 deletions

6
.classpath Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>

3
.gitignore vendored
View File

@ -1,2 +1,5 @@
out/ out/
/bin/ /bin/
*.jpeg
*.zip
*.bin

View File

@ -2,9 +2,6 @@
<artifact type="jar" build-on-make="true" name="Hajj-simulation:jar"> <artifact type="jar" build-on-make="true" name="Hajj-simulation:jar">
<output-path>$PROJECT_DIR$/out/artifacts/Hajj_simulation_jar</output-path> <output-path>$PROJECT_DIR$/out/artifacts/Hajj_simulation_jar</output-path>
<root id="archive" name="Hajj-simulation.jar"> <root id="archive" name="Hajj-simulation.jar">
<element id="directory" name="META-INF">
<element id="file-copy" path="$PROJECT_DIR$/out/META-INF/MANIFEST.MF" />
</element>
<element id="module-output" name="Hajj-simulation" /> <element id="module-output" name="Hajj-simulation" />
</root> </root>
</artifact> </artifact>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" /> <output url="file://$PROJECT_DIR$/out" />
</component> </component>
</project> </project>

17
.project Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>Hajj-simulation</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

14
package.sh Executable file
View File

@ -0,0 +1,14 @@
#!/bin/bash
GIT=$(command -v git)
HEAD=$(command -v head)
CUT=$(command -v cut)
JAR_ARTIFACT="out/artifacts/Hajj_simulation_jar/Hajj-simulation.jar"
if [ -z $"GIT" ] || [ -z $"HEAD" ] || [ -z $"CUT" ]; then
echo "Tools missing"
exit 1
else
tar -cvf Hajj-Simulation-$(git log | head -n1 | cut -d' ' -f2).tar.gz $JAR_ARTIFACT run.sh
fi

9
run.sh Executable file
View File

@ -0,0 +1,9 @@
#!/bin/bash
jav=$(command -v java)
if [ -z "$jav" ]; then
>&2 echo "Can't find java installation"
else
java -jar out/artifacts/Hajj_simulation_jar/Hajj-simulation.jar
fi

View File

@ -30,6 +30,14 @@ public class Bus extends CivilVehicle {
return TIME_TO_FIX; return TIME_TO_FIX;
} }
@Override
public String toString() {
StringBuilder s = new StringBuilder();
s.append(String.format("ID: %s, Campaign ID: %s\n",this.getUID() , getCampaign().getUID()));
s.append(super.toString());
return s.toString();
}
private void generateUID() { private void generateUID() {
numeberOfBuses++; numeberOfBuses++;
this.UID = String.format("BUS%04d", numeberOfBuses); this.UID = String.format("BUS%04d", numeberOfBuses);

View File

@ -1,7 +1,8 @@
import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
public class Campaign { public class Campaign implements Serializable {
private String UID; private String UID;
private int numberOfAriivedBuses; private int numberOfAriivedBuses;
@ -123,4 +124,13 @@ public class Campaign {
public int getPercentArrived() { public int getPercentArrived() {
return ((numberOfAriivedBuses/vehicles.size()) *100); return ((numberOfAriivedBuses/vehicles.size()) *100);
} }
public String toString(){
return String.format("ID: %s\n" +
"District: %s\n" +
"Bueses: %d, Arrived buses: %d\n",
getUID(),
getHotelDistrict().name(),
getNumberOfBusses(), getNumberOfArrivedBuses());
}
} }

182
src/DataManeger.java Normal file
View File

@ -0,0 +1,182 @@
import java.io.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class DataManeger {
private File workingDir;
public DataManeger(){
workingDir = new File("./data/");
workingDir.mkdir();
clearData();
}
public boolean stateAvailable(Date time) {
File f = new File(String.format("./data/%s.bin", time.getTime()));
return f.exists();
}
public State loadState(Date time){
State state = null;
if (stateAvailable(time)){
try {
ObjectInputStream objectInputStream = new ObjectInputStream(
new FileInputStream(String.format("./data/%s.bin", time.getTime())));
state = (State)objectInputStream.readObject();
objectInputStream.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
return state;
}
public boolean saveState(State state, Date time){
try {
FileOutputStream fs = new FileOutputStream(String.format("./data/%s.bin", time.getTime()));
BufferedOutputStream bfs = new BufferedOutputStream(fs);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(bfs);
objectOutputStream.writeObject(state);
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
public File[] savedStateFiles() {
return workingDir.listFiles();
}
public Date[] savedStatesTimes() {
File[] files = savedStateFiles();
ArrayList<Date> timesList = new ArrayList<>();
for (File file : files){
if (file.getName().contains(".bin")){
String timeInName = file.getName().replaceAll(".bin", "").trim();
if ("".equals(timeInName)) continue;
long time = Long.parseLong(timeInName);
timesList.add(new HijriDate(time));
}
}
Date[] times = new Date[timesList.size()];
times = timesList.toArray(times);
return times;
}
public List<State> getStates(){
List<State> list = new ArrayList<>();
for (File file : workingDir.listFiles()) {
if (file.getName().contains(".bin")){
try {
FileInputStream fileInputStream = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
ObjectInputStream objectInputStream = new ObjectInputStream(bufferedInputStream);
State state = (State) objectInputStream.readObject();
list.add(state);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
return list;
}
private void clearData() {
for (File file : savedStateFiles()) {
if (file.getName().contains(".bin")){
file.delete();
}
}
}
}
class State implements Serializable {
//A better implementation is to make this more general or make Makkah an instance.
private ArrayList<Campaign> listOfCampaigns;
private ArrayList<Vehicle> listOfVehicles;
private ArrayList<Campaign>[] campPerDistrict;
private Route[] stdRoutes;
private Street[] stdStreet;
private Date allArrivedToArafatTime;
private Date allArrivedToHotelsTime;
private Date stateTime;
private String maxTrip;
private String minTrip;
public State(ArrayList<Campaign> listOfCampaigns,
ArrayList<Vehicle> listOfVehicles,
ArrayList<Campaign>[] campPerDistrict,
Route[] stdRoutes,
Street[] stdStreet,
Date allArrivedToArafatTime,
Date allArrivedToHotelsTime,
Date stateTime) {
//Make clones since values may change if this is running on a thread.
this.listOfCampaigns = (ArrayList<Campaign>) listOfCampaigns.clone();
this.listOfVehicles = (ArrayList<Vehicle>) listOfVehicles.clone();
this.campPerDistrict = (ArrayList<Campaign>[])campPerDistrict.clone();
this.stdRoutes = stdRoutes.clone();
this.stdStreet = stdStreet.clone();
if (allArrivedToArafatTime != null) {
this.allArrivedToArafatTime = (Date) allArrivedToArafatTime.clone();
}
if (allArrivedToHotelsTime != null) {
this.allArrivedToHotelsTime = (Date) allArrivedToHotelsTime.clone();
}
this.stateTime = stateTime;
if (Vehicle.getMinArrived() != null && Vehicle.getMaxArrived() != null){
this.maxTrip = Vehicle.getMaxArrived().getTripTime();
this.minTrip = Vehicle.getMinArrived().getTripTime();
}
else {
this.maxTrip = "N/A";
this.minTrip = "N/A";
}
}
public ArrayList<Campaign> getListOfCampaigns() {
return listOfCampaigns;
}
public ArrayList<Vehicle> getListOfVehicles() {
return listOfVehicles;
}
public ArrayList<Campaign>[] getCampPerDistrict() {
return campPerDistrict;
}
public Route[] getStdRoutes() {
return stdRoutes;
}
public Street[] getStdStreet() {
return stdStreet;
}
public Date getAllArrivedToArafatTime() {
return allArrivedToArafatTime;
}
public Date getAllArrivedToHotelsTime() {
return allArrivedToHotelsTime;
}
public Date getStateTime() {
return stateTime;
}
public String getMaxTrip() {
return maxTrip;
}
public String getMinTrip() {
return minTrip;
}
}

56
src/EventControll.java Normal file
View File

@ -0,0 +1,56 @@
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import java.awt.Font;
import java.awt.Color;
import javax.swing.JScrollBar;
import javax.swing.JTextField;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import javax.swing.JScrollPane;
public class EventControll {
private JFrame frame;
//private JTextField textField;
private JTextField textField_2;
private JTextField textField_3;
private JTextField textField_4;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
EventControll window = new EventControll();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public EventControll() {
initialize();
}
private void initialize() {
frame = new JFrame();
frame.getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
for (int i = 0; i<10 ; i++) {
JTextField textField = new JTextField();
int x =(int)(((double)i/9.0)*255);
textField.setBackground(new Color(255,x,0));
frame.getContentPane().add(textField);
textField.setColumns(10);
}
}
public void setData(Object A) {
//lblNewLabel.setText(A.toString());
}
}

512
src/GUI_History.java Normal file
View File

@ -0,0 +1,512 @@
import java.awt.Color;
import java.awt.Font;
import java.util.*;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.UIManager;
import java.awt.SystemColor;
public class GUI_History {
private List<State> states;
private State selectedState;
private ArrayList<Campaign> listOfCampaigns;
private ArrayList<Vehicle> listOfVehicles;
private ArrayList<Campaign>[] campPerDistrict;
private Route[] stdRoutes;
private Street[] stdStreet;
private Date currenttimeManager;
private JFrame frame;
private JTable streetTable;
private JTable districtTable;
private JLabel lblDate;
private JLabel lblDestination;
private JLabel lblNumOfBuses;
private JLabel lblNumOfDonebuses;
private JLabel lblMaximumTripValue;
private JLabel lblMinimumTripValue;
private JLabel lblBusesArrivedInTheLastHourValue;
private JLabel lblAverageTripForLastHourValue;
private JLabel lblAverageTimeForTheTrip;
private Object[][] streetData;
private String[] streetColNames = {"Street Name", "Street Load %", "Total", "Buses",
"Local Vehicles","Avg. Time"};
private String[] districtColNames = {"District", "Campaigns", "Busses", "Arrival %",
"Avg. Time", "Best time to Arafat", "Best time to District"};
public GUI_History(List<State> states) {
this.states = states;
makeFrame();
}
private void makeFrame() {
setData(states.get(0));
frame = new JFrame("History");
frame.setBounds(200, 150, 1386, 731);
frame.setLocationRelativeTo(null);
frame.getContentPane().setBackground(new Color(50,50,50));
frame.getContentPane().setForeground(new Color(0, 0, 0));
frame.getContentPane().setLayout(null);
frame.revalidate();
frame.setAutoRequestFocus(false);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
streetData = new Object[stdStreet.length][6];
for (int i = 0; i < stdStreet.length; i++) {
streetData[i][0] = stdStreet[i].getName().name();
streetData[i][1] = stdStreet[i].getPercentRemainingCapacity();
streetData[i][2] = stdStreet[i].getVehicles().size();
streetData[i][3] = stdStreet[i].getNumberOfBuses();
streetData[i][4] = stdStreet[i].getNumberOfLocalCars();
streetData[i][5] = MakkahCity.avgTimeOnStreet(stdStreet[i]);
}
//District data
Object[][] districtData = new Object[campPerDistrict.length][7];
for (int i = 0; i < campPerDistrict.length; i++) {
districtData[i][0] = campPerDistrict[i].get(0).getHotelDistrict().name();
districtData[i][1] = campPerDistrict[i].size();
districtData[i][2] = MakkahCity.busesInDistrict(District.values()[i]);
districtData[i][3] = MakkahCity.getPercentArrival(District.values()[i]);
districtData[i][4] = MakkahCity.getAvgTimeOfTrip(District.values()[i]);
districtData[i][5] = MakkahCity.getShortestRoute(campPerDistrict[i].get(0), Mashier.ARAFAT).getFastestTimeOfTravel(new Bus());
districtData[i][6] = MakkahCity.getShortestRoute(campPerDistrict[i].get(0), Mashier.MINA).getFastestTimeOfTravel(new Bus());
}
//tables
//Street table
streetTable = new JTable(streetData,streetColNames);
streetTable.setEnabled(false);
DefaultTableModel model = new DefaultTableModel();
model.setColumnIdentifiers(streetColNames);
streetTable.getTableHeader().setBackground(new Color(17,17,17));
streetTable.getTableHeader().setForeground(Color.WHITE);
streetTable.getTableHeader().setFont(new Font("Rockwell", Font.PLAIN, 18));
streetTable.setBackground(new Color(17,17,17));
streetTable.setForeground(Color.white);
streetTable.setSelectionBackground(Color.RED);
streetTable.setGridColor(new Color(102, 102, 102));
streetTable.setSelectionForeground(Color.white);
streetTable.setFont(new Font("Rockwell", Font.PLAIN, 18));
streetTable.setRowHeight(25);
streetTable.setAutoCreateRowSorter(true);
JScrollPane streetScroll = new JScrollPane(streetTable);
streetScroll.setBounds(30,75,1140,329);
frame.getContentPane().add(streetScroll);
//District table
districtTable = new JTable(districtData,districtColNames);
districtTable.setEnabled(false);
districtTable.setForeground(new Color(255, 255, 255));
districtTable.getTableHeader().setFont(new Font("Rockwell", Font.PLAIN, 18));
districtTable.getTableHeader().setBackground(new Color(17,17,17));
districtTable.getTableHeader().setForeground(Color.WHITE);
districtTable.setBackground(new Color(17,17,17));
districtTable.setSelectionBackground(Color.RED);
model.setColumnIdentifiers(districtColNames);
districtTable.setSelectionForeground(Color.white);
districtTable.setFont(new Font("Rockwell", Font.PLAIN, 18));
districtTable.setGridColor(new Color(102, 102, 102));
JScrollPane districtScroll = new JScrollPane(districtTable);
districtScroll.setEnabled(false);
districtTable.setAutoCreateRowSorter(true);
districtTable.setRowHeight(25);
districtTable.revalidate();
districtScroll.setBounds(30,452,1140,105);
frame.getContentPane().add(districtScroll);
JLabel lblStreets = new JLabel("Streets");
lblStreets.setFont(new Font("Rockwell", Font.PLAIN, 24));
lblStreets.setForeground(new Color(255, 255, 255));
lblStreets.setBounds(30, 44, 208, 30);
frame.getContentPane().add(lblStreets);
JLabel lblDistrict = new JLabel("District");
lblDistrict.setFont(new Font("Rockwell", Font.PLAIN, 24));
lblDistrict.setForeground(new Color(255, 255, 255));
lblDistrict.setBounds(30, 425, 166, 29);
frame.getContentPane().add(lblDistrict);
JLabel lblTime = new JLabel("Time:");
lblTime.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblTime.setForeground(new Color(255, 255, 255));
lblTime.setBounds(50, 11, 72, 14);
frame.getContentPane().add(lblTime);
JLabel lblStatus = new JLabel("Status:");
lblStatus.setForeground(new Color(255, 255, 255));
lblStatus.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblStatus.setBounds(423, 9, 72, 18);
frame.getContentPane().add(lblStatus);
lblDestination = new JLabel();
lblDestination.setForeground(new Color(255, 255, 255));
lblDestination.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDestination.setBounds(477, 9, 184, 18);
frame.getContentPane().add(lblDestination);
lblDate = new JLabel(currenttimeManager.toString());
lblDate.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDate.setForeground(Color.WHITE);
lblDate.setBounds(100, 8, 326, 21);
frame.getContentPane().add(lblDate);
JLabel lblBuses = new JLabel("Buses: ");
lblBuses.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblBuses.setForeground(new Color(255, 255, 255));
lblBuses.setBackground(new Color(192, 192, 192));
lblBuses.setBounds(30, 578, 56, 14);
frame.getContentPane().add(lblBuses);
lblNumOfBuses = new JLabel();
lblNumOfBuses.setText("0");
lblNumOfBuses.setBackground(new Color(0, 0, 0));
lblNumOfBuses.setForeground(new Color(255, 255, 255));
lblNumOfBuses.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblNumOfBuses.setBounds(79, 579, 90, 12);
frame.getContentPane().add(lblNumOfBuses);
JLabel lblBusesDone = new JLabel("Buses Done:");
lblBusesDone.setForeground(new Color(255, 255, 255));
lblBusesDone.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblBusesDone.setBounds(169, 579, 101, 12);
frame.getContentPane().add(lblBusesDone);
lblNumOfDonebuses = new JLabel();
lblNumOfDonebuses.setText("0");
lblNumOfDonebuses.setForeground(new Color(255, 255, 255));
lblNumOfDonebuses.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblNumOfDonebuses.setBounds(259, 577, 80, 16);
frame.getContentPane().add(lblNumOfDonebuses);
JLabel lblMaximumTrip = new JLabel("Maximum Trip:");
lblMaximumTrip.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblMaximumTrip.setForeground(new Color(255, 255, 255));
lblMaximumTrip.setBounds(30, 619, 112, 22);
frame.getContentPane().add(lblMaximumTrip);
lblMaximumTripValue = new JLabel();
lblMaximumTripValue.setText("-:--");
lblMaximumTripValue.setForeground(new Color(255, 255, 255));
lblMaximumTripValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblMaximumTripValue.setBounds(150, 621, 46, 18);
frame.getContentPane().add(lblMaximumTripValue);
JLabel lblMinimumTrip = new JLabel("MinimumTrip:");
lblMinimumTrip.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblMinimumTrip.setForeground(Color.WHITE);
lblMinimumTrip.setBounds(30, 655, 112, 18);
frame.getContentPane().add(lblMinimumTrip);
lblMinimumTripValue = new JLabel("-:--");
lblMinimumTripValue.setForeground(Color.WHITE);
lblMinimumTripValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblMinimumTripValue.setBounds(139, 657, 46, 14);
frame.getContentPane().add(lblMinimumTripValue);
JLabel lblBusesArrivedInTheLastHour = new JLabel("Buses Arrived In The Last Hour:");
lblBusesArrivedInTheLastHour.setForeground(Color.WHITE);
lblBusesArrivedInTheLastHour.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblBusesArrivedInTheLastHour.setBounds(360, 578, 237, 14);
frame.getContentPane().add(lblBusesArrivedInTheLastHour);
lblBusesArrivedInTheLastHourValue = new JLabel();
lblBusesArrivedInTheLastHourValue.setText("0");
lblBusesArrivedInTheLastHourValue.setForeground(Color.WHITE);
lblBusesArrivedInTheLastHourValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblBusesArrivedInTheLastHourValue.setBounds(594, 578, 90, 14);
frame.getContentPane().add(lblBusesArrivedInTheLastHourValue);
JLabel lblAverageTripForLastHour = new JLabel("Average Trip For Last Hour:");
lblAverageTripForLastHour.setForeground(Color.WHITE);
lblAverageTripForLastHour.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblAverageTripForLastHour.setBackground(Color.BLACK);
lblAverageTripForLastHour.setBounds(206, 621, 208, 18);
frame.getContentPane().add(lblAverageTripForLastHour);
lblAverageTripForLastHourValue = new JLabel("(No Arrivals) In Last Hour");
lblAverageTripForLastHourValue.setForeground(Color.WHITE);
lblAverageTripForLastHourValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblAverageTripForLastHourValue.setBounds(423, 621, 216, 18);
frame.getContentPane().add(lblAverageTripForLastHourValue);
JLabel lblAvgTime = new JLabel("Average Time For The Trip:");
lblAvgTime.setForeground(Color.WHITE);
lblAvgTime.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblAvgTime.setBounds(206, 650, 208, 29);
frame.getContentPane().add(lblAvgTime);
lblAverageTimeForTheTrip = new JLabel("-:--");
lblAverageTimeForTheTrip.setForeground(Color.WHITE);
lblAverageTimeForTheTrip.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblAverageTimeForTheTrip.setBounds(423, 657, 101, 14);
frame.getContentPane().add(lblAverageTimeForTheTrip);
JButton btnViewRoutes = new JButton("View Routes");
btnViewRoutes.setBounds(1195, 75, 166, 30);
btnViewRoutes.setFont(new Font("Rockwell", Font.PLAIN, 16));
btnViewRoutes.setBackground(new Color(9,9,9));
btnViewRoutes.setForeground(Color.white);
btnViewRoutes.addActionListener(e -> {
GUI_ViewRoute r = new GUI_ViewRoute(stdRoutes ,listOfCampaigns, currenttimeManager);
});
frame.getContentPane().add(btnViewRoutes);
JButton btnViewBuses = new JButton("View Buses");
btnViewBuses.setBounds(1195, 130, 166, 30);
btnViewBuses.setFont(new Font("Rockwell", Font.PLAIN, 16));
btnViewBuses.setBackground(new Color(9,9,9));
btnViewBuses.setForeground(Color.white);
btnViewBuses.addActionListener(e -> {
GUI_ViewBuses t = new GUI_ViewBuses(listOfCampaigns , currenttimeManager);
});
frame.getContentPane().add(btnViewBuses);
JButton btnViewStreet = new JButton("View Street");
btnViewStreet.setBounds(1195, 185, 166, 29);
btnViewStreet.setFont(new Font("Rockwell", Font.PLAIN, 16));
btnViewStreet.setBackground(new Color(9,9,9));
btnViewStreet.setForeground(Color.white);
btnViewStreet.addActionListener(e -> {
GUI_ViewStreet t = new GUI_ViewStreet(stdStreet,currenttimeManager);
});
frame.getContentPane().add(btnViewStreet);
JComboBox comboBox = new JComboBox<Date>();
comboBox.setBackground(new Color(150, 150 , 150));
comboBox.setBounds(1143, 11, 217, 33);
for (State state : states) {
comboBox.addItem(state.getStateTime());
}
comboBox.addActionListener(e ->{
setData(states.get(comboBox.getSelectedIndex()));
updateFrame();
});
frame.getContentPane().add(comboBox);
updateFrame();
}
public void setData(State state) {
listOfCampaigns = state.getListOfCampaigns();
listOfVehicles = state.getListOfVehicles();
campPerDistrict = state.getCampPerDistrict();
stdRoutes = state.getStdRoutes();
stdStreet = state.getStdStreet();
currenttimeManager = state.getStateTime();
selectedState = state;
}
public void updateFrame() {
streetData = new Object[stdStreet.length][6];
for (int i = 0; i < stdStreet.length; i++) {
streetData[i][0] = stdStreet[i].getName().name();
streetData[i][1] = stdStreet[i].getPercentRemainingCapacity();
streetData[i][2] = stdStreet[i].getVehicles().size();
streetData[i][3] = stdStreet[i].getNumberOfBuses();
streetData[i][4] = stdStreet[i].getNumberOfLocalCars();
streetData[i][5] = avgTimeOnStreet(stdStreet[i]);
}
streetTable.setModel(new DefaultTableModel(streetData ,streetColNames));
Object[][] districtData = new Object[campPerDistrict.length][7];
for (int i = 0; i < campPerDistrict.length; i++) {
districtData[i][0] = campPerDistrict[i].get(0).getHotelDistrict().name();
districtData[i][1] = campPerDistrict[i].size();
districtData[i][2] = busesInDistrict(District.values()[i]);
districtData[i][3] = getPercentArrival(District.values()[i]);
districtData[i][4] = getAvgTimeOfTrip(District.values()[i]);
districtData[i][5] = getShortestRoute(campPerDistrict[i].get(0), Mashier.ARAFAT).getFastestTimeOfTravel(new Bus());
districtData[i][6] = getShortestRoute(campPerDistrict[i].get(0), Mashier.MINA).getFastestTimeOfTravel(new Bus());
}
districtTable.setModel(new DefaultTableModel(districtData, districtColNames));
lblDate.setText(currenttimeManager.toString());
String status = "";
if (currenttimeManager.getDay() == 9) {
status = "Heading to Arafat";
}
else{
status = "Heading to Hotels";
}
lblDestination.setText(status);
int numberOfBusses = 0;
for (Campaign campaign : listOfCampaigns) {
numberOfBusses += campaign.getNumberOfBusses();
}
String bus = String.format("%d", numberOfBusses);
lblNumOfBuses.setText(bus);
String numOfdoneBuses = String.format("%d", getNumberOfArrivedBusses());
lblNumOfDonebuses.setText(numOfdoneBuses);
String NumberOfBussPerHour = String.format("%d", getNumberOfArrivedBussesPerHour());
lblBusesArrivedInTheLastHourValue.setText(NumberOfBussPerHour);
lblAverageTripForLastHourValue.setText(avgTimeOfTrip());
lblAverageTimeForTheTrip.setText(getAvgTripForAllDis());
lblMaximumTripValue.setText(selectedState.getMaxTrip());
lblMinimumTripValue.setText(selectedState.getMinTrip());
}
//Methods
public String avgTimeOnStreet(Street street) {
int sum = 0;
int counter = 1;
for (Campaign campaign : listOfCampaigns)
for (Vehicle vehicle : campaign.getArrivedVehicles())
if (vehicle.hasCrossedStreet(street)){
sum += vehicle.getTimeOnStreet(street);
counter++;
}
sum /= counter;
int hours = sum / 60;
int minutes = sum % 60;
if (hours == 0 && minutes == 0) return street.getFastestTimeOfTravel(new Bus());
return String.format("%02d:%02d", hours, minutes);
}
private int busesInDistrict(District district){
int buses = 0;
for (Campaign campaign : campPerDistrict[district.ordinal()]){
buses += campaign.getNumberOfBusses();
}
return buses;
}
private int getPercentArrival(District district) {
int sum = 0;
for (Campaign campaign : campPerDistrict[district.ordinal()]) {
sum += campaign.getPercentArrived();
}
return sum/campPerDistrict[district.ordinal()].size();
}
private String getAvgTimeOfTrip(District district){
int sum = 0;
int counter = 1;
for (Campaign campaign : campPerDistrict[district.ordinal()]) {
for (Vehicle vehicle : campaign.getVehicles()) {
if (vehicle.isArrivedToDest()) {
long minutes = (vehicle.getTimeOfArrival().getTime() - vehicle.getTimeStartedMoving().getTime())/60000;
sum+= minutes;
counter++;
}
}
}
sum = sum /counter;
int hours = sum / 60;
int minutes = sum % 60;
if (hours == 0 && minutes == 0) return " n/a";
return String.format("%2d:%02d", hours,minutes);
}
private Route getShortestRoute(Campaign campaign, Mashier mashier) {
Route[] routes = getRoutesToDistrict(campaign.getHotelDistrict());
Route route = null;
double min = Double.MAX_VALUE;
for (Route r : routes) {
if (r.getMashier() == mashier){
if (r.getTotalLength() < min) {
min = r.getTotalLength();
route = r;
}
}
}
return route;
}
private Route[] getRoutesToDistrict(District district) {
ArrayList<Route> routes = new ArrayList<>();
for (Route route : stdRoutes) {
if (route.getHotelArea() == district) {
routes.add(route);
}
}
Route[] routesArray = new Route[routes.size()];
return routes.toArray(routesArray);
}
public int getNumberOfArrivedBusses() {
int num = 0;
for (Campaign campaign : listOfCampaigns) {
for (Vehicle vehicle : campaign.getVehicles()){
if (vehicle instanceof Bus &&
vehicle.isArrivedToDest()) num++;
}
}
return num;
}
public int getNumberOfArrivedBussesPerHour() {
Calendar now = new GregorianCalendar();
now.setTime(currenttimeManager);
Calendar from = (GregorianCalendar)now.clone();
from.roll(Calendar.HOUR, -1);
int num = 0;
for (Campaign campaign : listOfCampaigns){
for (Vehicle bus : campaign.getVehicles()){
if (bus.isArrivedToDest() && bus.getTimeOfArrival().before(now.getTime())
&& bus.getTimeOfArrival().after(from.getTime())) {
num++;
}
}
}
return num;
}
public String avgTimeOfTrip() {
//TODO: does output diff value even after all have arrived.
Calendar now = new GregorianCalendar();
now.setTime(currenttimeManager);
Calendar from = (GregorianCalendar)now.clone();
from.roll(Calendar.HOUR, -1);
int counter = 1;
int sum = 0;
for (Campaign campaign : listOfCampaigns){
for (Vehicle bus : campaign.getVehicles()){
if (bus.isArrivedToDest() && bus.getTimeOfArrival().before(now.getTime())
&& bus.getTimeOfArrival().after(from.getTime())) {
long minutes = (bus.getTimeOfArrival().getTime() - bus.getTimeStartedMoving().getTime())/60000;
sum+= minutes;
counter++;
}
}
}
sum = sum /counter;
int hours = sum / 60;
int minutes = sum % 60;
if (hours == 0 && minutes == 0) return "(No Arrivals) In Last Hour";
return String.format("%2d:%02d", hours, minutes);
}
public String getAvgTripForAllDis() {
int sum = 0;
int counter = 1;
for (Campaign campaign : listOfCampaigns) {
for (Vehicle vehicle : campaign.getVehicles()) {
if (vehicle.isArrivedToDest()) {
long minutes = (vehicle.getTimeOfArrival().getTime() - vehicle.getTimeStartedMoving().getTime())/60000;
sum+= minutes;
counter++;
}
}
}//Make the following a method since it is the same other method
sum = sum /counter;
int hours = sum / 60;
int minutes = sum % 60;
if (hours == 0 && minutes == 0) return "-:--";
return String.format("%2d:%02d", hours,minutes);
}
}

237
src/GUI_Report.java Normal file
View File

@ -0,0 +1,237 @@
import java.awt.Color;
import java.awt.Font;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class GUI_Report {
JFrame frame;
private static ArrayList<Campaign> listOfCampaigns;
private static Route[] stdRoutes;
private JTable streetTable;
private JTable districtTable;
private Street[] stdStreet;
private Date currenttimeManager;
private static ArrayList<Campaign>[] campPerDistrict;
private String[] streetColNames = {"Street Name", "Street Load %", "Total","Buses","Local Vehicles","Avg. Time"};
private String[] districtColNames = {"District", "Campaigns", "Busses", "Arrival %","Avg. Time", "Best time to Arafat", "Best time to District"};
private Object[][] streetData;
private Object[][] districtData;
private JLabel lblDate;
public GUI_Report(ArrayList<Campaign> listOfCampaigns, Route[] stdRoutes, Street[] stdStreet, ArrayList<Campaign>[] campPerDistrict, Date currenttimeManager) {
this.listOfCampaigns = listOfCampaigns;
this.stdRoutes = stdRoutes;
this.stdStreet = stdStreet;
this.campPerDistrict = campPerDistrict;
this.currenttimeManager = currenttimeManager;
makeFrame();
}
private void makeFrame() {
frame = new JFrame("Report");
//Street data
streetData = new Object[stdStreet.length][6];
for (int i = 0; i < stdStreet.length; i++) {
streetData[i][0] = stdStreet[i].getName().name();
streetData[i][1] = stdStreet[i].getPercentRemainingCapacity();
streetData[i][2] = stdStreet[i].getVehicles().size();
streetData[i][3] = stdStreet[i].getNumberOfBuses();
streetData[i][4] = stdStreet[i].getNumberOfLocalCars();
streetData[i][5] = avgTimeOnStreet(stdStreet[i]);
}
DefaultTableModel model = new DefaultTableModel();
model.setColumnIdentifiers(streetColNames);
//district
districtData = new Object[campPerDistrict.length][7];
for (int i = 0; i < campPerDistrict.length; i++) {
districtData[i][0] = campPerDistrict[i].get(0).getHotelDistrict().name();
districtData[i][1] = campPerDistrict[i].size();
districtData[i][2] = busesInDistrict(District.values()[i]);
districtData[i][3] = getPercentArrival(District.values()[i]);
districtData[i][4] = getAvgTimeOfTrip(District.values()[i]);
districtData[i][5] = getShortestRoute(campPerDistrict[i].get(0), Mashier.ARAFAT).getFastestTimeOfTravel(new Bus());
districtData[i][6] = getShortestRoute(campPerDistrict[i].get(0), Mashier.MINA).getFastestTimeOfTravel(new Bus());
}
//tables
//Street table
streetTable = new JTable(streetData,streetColNames);
streetTable.setEnabled(false);
streetTable.getTableHeader().setBackground(new Color(17,17,17));
streetTable.getTableHeader().setForeground(Color.WHITE);
streetTable.getTableHeader().setFont(new Font("Rockwell", Font.PLAIN, 18));
streetTable.setBackground(new Color(17,17,17));
streetTable.setForeground(Color.white);
streetTable.setGridColor(new Color(102, 102, 102));
streetTable.setSelectionForeground(Color.white);
streetTable.setFont(new Font("Rockwell", Font.PLAIN, 18));
streetTable.setRowHeight(20);
streetTable.setAutoCreateRowSorter(true);
JScrollPane streetScroll = new JScrollPane(streetTable);
streetTable.getColumnModel().getColumn(0).setPreferredWidth(111);
streetTable.getColumnModel().getColumn(1).setPreferredWidth(46);
streetTable.getColumnModel().getColumn(2).setPreferredWidth(1);
streetTable.getColumnModel().getColumn(3).setPreferredWidth(0);
streetTable.getColumnModel().getColumn(4).setPreferredWidth(60);
streetTable.getColumnModel().getColumn(5).setPreferredWidth(0);
streetScroll.setBounds(10,75,809,269);
//District table
districtTable = new JTable(districtData,districtColNames);
districtTable.setEnabled(false);
districtTable.setForeground(new Color(255, 255, 255));
districtTable.getTableHeader().setFont(new Font("Rockwell", Font.PLAIN, 18));
districtTable.getTableHeader().setBackground(new Color(17,17,17));
districtTable.getTableHeader().setForeground(Color.WHITE);
districtTable.setBackground(new Color(17,17,17));
districtTable.setSelectionBackground(Color.RED);
model.setColumnIdentifiers(districtColNames);
districtTable.setSelectionForeground(Color.white);
districtTable.setFont(new Font("Rockwell", Font.PLAIN, 18));
districtTable.setGridColor(new Color(102, 102, 102));
JScrollPane districtScroll = new JScrollPane(districtTable);
districtScroll.setEnabled(false);
districtTable.setAutoCreateRowSorter(true);
districtTable.getColumnModel().getColumn(0).setPreferredWidth(43);
districtTable.getColumnModel().getColumn(1).setPreferredWidth(30);
districtTable.getColumnModel().getColumn(2).setPreferredWidth(0);
districtTable.getColumnModel().getColumn(3).setPreferredWidth(0);
districtTable.getColumnModel().getColumn(4).setPreferredWidth(0);
districtTable.getColumnModel().getColumn(5).setPreferredWidth(85);
districtTable.getColumnModel().getColumn(6).setPreferredWidth(93);
districtTable.setRowHeight(20);
districtTable.revalidate();
districtScroll.setBounds(10,395,809,89);
//lbl
JLabel lblTime = new JLabel("Time:");
lblTime.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblTime.setForeground(new Color(255, 255, 255));
lblTime.setBounds(50, 11, 72, 14);
//Add Elements
frame.getContentPane().add(streetScroll);
frame.getContentPane().add(districtScroll);
frame.getContentPane().setBackground(new Color(50,50,50));
frame.getContentPane().setForeground(new Color(0, 0, 0));
frame.setBounds(100,100,856,540);
frame.getContentPane().setLayout(null);
JLabel lblStreets = new JLabel("Streets");
lblStreets.setForeground(Color.WHITE);
lblStreets.setFont(new Font("Rockwell", Font.PLAIN, 24));
lblStreets.setBounds(10, 34, 208, 30);
frame.getContentPane().add(lblStreets);
JLabel lblDistrict = new JLabel("District");
lblDistrict.setForeground(Color.WHITE);
lblDistrict.setFont(new Font("Rockwell", Font.PLAIN, 24));
lblDistrict.setBounds(10, 355, 166, 29);
frame.getContentPane().add(lblDistrict);
JLabel lblTime_1 = new JLabel("Time:");
lblTime_1.setForeground(Color.WHITE);
lblTime_1.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblTime_1.setBounds(190, 21, 72, 14);
frame.getContentPane().add(lblTime_1);
lblDate = new JLabel(currenttimeManager.toString());
lblDate.setForeground(Color.WHITE);
lblDate.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDate.setBounds(238, 18, 326, 21);
frame.getContentPane().add(lblDate);
frame.setLocationRelativeTo(null);
frame.revalidate();
frame.setLocation(100,150);
frame.setAutoRequestFocus(false);
frame.setVisible(true);
}
//Methods
public static String avgTimeOnStreet(Street street) {
int sum = 0;
int counter = 1;
for (Campaign campaign : listOfCampaigns)
for (Vehicle vehicle : campaign.getArrivedVehicles())
if (vehicle.hasCrossedStreet(street)){
sum += vehicle.getTimeOnStreet(street);
counter++;
}
sum /= counter;
int hours = sum / 60;
int minutes = sum % 60;
if (hours == 0 && minutes == 0) return street.getFastestTimeOfTravel(new Bus());
return String.format("%02d:%02d", hours, minutes);
}
private static int busesInDistrict(District district){
int buses = 0;
for (Campaign campaign : campPerDistrict[district.ordinal()]){
buses += campaign.getNumberOfBusses();
}
return buses;
}
private static int getPercentArrival(District district) {
int sum = 0;
for (Campaign campaign : campPerDistrict[district.ordinal()]) {
sum += campaign.getPercentArrived();
}
return sum/campPerDistrict[district.ordinal()].size();
}
private static String getAvgTimeOfTrip(District district){
int sum = 0;
int counter = 1;
for (Campaign campaign : campPerDistrict[district.ordinal()]) {
for (Vehicle vehicle : campaign.getVehicles()) {
if (vehicle.isArrivedToDest()) {
long minutes = (vehicle.getTimeOfArrival().getTime() - vehicle.getTimeStartedMoving().getTime())/60000;
sum+= minutes;
counter++;
}
}
}
sum = sum /counter;
int hours = sum / 60;
int minutes = sum % 60;
if (hours == 0 && minutes == 0) return " n/a";
return String.format("%2d:%02d", hours,minutes);
}
private static Route getShortestRoute(Campaign campaign, Mashier mashier) {
Route[] routes = getRoutesToDistrict(campaign.getHotelDistrict());
Route route = null;
double min = Double.MAX_VALUE;
for (Route r : routes) {
if (r.getMashier() == mashier){
if (r.getTotalLength() < min) {
min = r.getTotalLength();
route = r;
}
}
}
return route;
}
private static Route[] getRoutesToDistrict(District district) {
ArrayList<Route> routes = new ArrayList<>();
for (Route route : stdRoutes) {
if (route.getHotelArea() == district) {
routes.add(route);
}
}
Route[] routesArray = new Route[routes.size()];
return routes.toArray(routesArray);
}
}

224
src/GUI_ViewBuses.java Normal file
View File

@ -0,0 +1,224 @@
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Font;
import java.util.ArrayList;
import java.util.Calendar;
import javax.swing.JScrollPane;
import javax.swing.JButton;
import java.awt.Color;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.swing.table.DefaultTableModel;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.JTextField;
import javax.swing.DropMode;
import javax.swing.JTextPane;
public class GUI_ViewBuses {
private JFrame frame;
private ArrayList<Vehicle> vehicles = new ArrayList<>();
private ArrayList<Vehicle> vehiclesAlazizya = new ArrayList<>();
private ArrayList<Vehicle> vehiclesAlhijra = new ArrayList<>();
private ArrayList<Vehicle> vehiclesAlmansoor = new ArrayList<>();
private Date currenttimeManager;
private JTable table;
private Object[][] busData;
private String[] busColNames = {"ID", "Street", "location","Progress", "trip time", "Arrive Time"};
private JButton Alazizya;
private JButton Alhijra;
private JButton Almansoor;
private JLabel lblTime;
private JLabel lblDate;
private JLabel lblStatus;
private JLabel lblDestination;
private JLabel lblDistrict;
private JLabel lblDistrictValue;
private JTextPane textPane;
public GUI_ViewBuses(ArrayList<Campaign> campaign , Date currenttimeManager) {
for (Campaign camp : campaign) {
switch (camp.getHotelDistrict()) {
case ALAZIZIYA:
vehiclesAlazizya.add(camp.getVehicles().get(0));
break;
case ALHIJRA:
vehiclesAlhijra.add(camp.getVehicles().get(0));
break;
case ALMANSOOR:
vehiclesAlmansoor.add(camp.getVehicles().get(0));
break;
default:
break;
}
}
this.currenttimeManager = currenttimeManager;
makeFrame();
}
private void makeFrame() {
frame = new JFrame("Buses");
table = new JTable(busData,busColNames);
table.setColumnSelectionAllowed(true);
table.setCellSelectionEnabled(true);
DefaultTableModel model = new DefaultTableModel();
model.setColumnIdentifiers(busColNames);
ListSelectionModel model2 = table.getSelectionModel();
model2.addListSelectionListener(e -> {
if (!model2.isSelectionEmpty()) {
int row = model2.getMinSelectionIndex();
textPane.setText(((Bus)vehicles.get(row)).toString());
}
});
table.getTableHeader().setBackground(new Color(17,17,17));
table.getTableHeader().setFont(new Font("Rockwell", Font.PLAIN, 18));
table.getTableHeader().setForeground(Color.WHITE);
table.setModel(new DefaultTableModel(busData ,busColNames));
table.setBackground(new Color(17,17,17));
table.setForeground(Color.WHITE);
table.setGridColor(new Color(102, 102, 102));
table.setFont(new Font("Rockwell", Font.PLAIN, 18));
table.setRowHeight(25);
table.setAutoCreateRowSorter(true);
table.revalidate();
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.getVerticalScrollBar().setBackground(new Color(17,17,17));
scrollPane.setBounds(20, 24, 887, 236);
frame.getContentPane().setBackground(new Color(50,50,50));
frame.getContentPane().setForeground(new Color(0, 0, 0));
frame.setBounds(100,100,972,454);
frame.getContentPane().setLayout(null);
frame.setLocationRelativeTo(null);
frame.getContentPane().add(scrollPane);
Alazizya = new JButton("Alazizya");
Alazizya.setBackground(new Color(9,9,9));
Alazizya.setFont(new Font("Rockwell", Font.PLAIN, 16));
Alazizya.setForeground(Color.white);
Alazizya.setBounds(20, 366, 116, 23);
Alazizya.addActionListener(e -> {
if (vehiclesAlazizya.get(0).getRoute() != null)
updateVehicles(vehiclesAlazizya);
});
frame.getContentPane().add(Alazizya);
Alhijra = new JButton("Alhijra");
Alhijra.setBackground(new Color(9,9,9));
Alhijra.setFont(new Font("Rockwell", Font.PLAIN, 16));
Alhijra.setForeground(Color.white);
Alhijra.setBounds(20, 269, 116, 23);
Alhijra.addActionListener(e -> {
if (vehiclesAlhijra.get(0).getRoute() != null)
updateVehicles(vehiclesAlhijra);
});
frame.getContentPane().add(Alhijra);
Almansoor = new JButton("Almansoor");
Almansoor.setBackground(new Color(9,9,9));
Almansoor.setFont(new Font("Rockwell", Font.PLAIN, 16));
Almansoor.setForeground(Color.white);
Almansoor.setBounds(20, 316, 116, 23);
Almansoor.addActionListener(e -> {
if (vehiclesAlmansoor.get(0).getRoute() != null)
updateVehicles(vehiclesAlmansoor);
});
frame.getContentPane().add(Almansoor);
lblTime = new JLabel("Time:");
lblTime.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblTime.setForeground(new Color(255, 255, 255));
lblTime.setBounds(180, 273, 72, 14);
frame.getContentPane().add(lblTime);
lblStatus = new JLabel("Status:");
lblStatus.setForeground(new Color(255, 255, 255));
lblStatus.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblStatus.setBounds(180, 317, 72, 18);
frame.getContentPane().add(lblStatus);
lblDate = new JLabel(currenttimeManager.toString());
lblDate.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDate.setForeground(Color.WHITE);
lblDate.setBounds(235, 270, 326, 21);
frame.getContentPane().add(lblDate);
lblDestination = new JLabel();
lblDestination.setForeground(Color.WHITE);
lblDestination.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDestination.setBounds(235, 317, 184, 18);
frame.getContentPane().add(lblDestination);
Calendar cal = new GregorianCalendar();
cal.setTime(currenttimeManager);
if (cal.get(Calendar.DAY_OF_MONTH) == 9)
lblDestination.setText("Heading to Arafat");
else lblDestination.setText("Heading to Hotels");
lblDistrict = new JLabel("District: ");
lblDistrict.setForeground(Color.WHITE);
lblDistrict.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDistrict.setBackground(Color.LIGHT_GRAY);
lblDistrict.setBounds(180, 370, 72, 14);
frame.getContentPane().add(lblDistrict);
lblDistrictValue = new JLabel();
lblDistrictValue.setForeground(Color.WHITE);
lblDistrictValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDistrictValue.setBackground(Color.BLACK);
lblDistrictValue.setBounds(247, 371, 129, 12);
frame.getContentPane().add(lblDistrictValue);
textPane = new JTextPane();
textPane.setFont(new Font("Rockwell", Font.PLAIN, 16));
textPane.setForeground(Color.WHITE);
textPane.setBackground(Color.BLACK);
JScrollPane scrolltext = new JScrollPane(textPane);
scrolltext.setBounds(523, 271, 384, 133);
frame.getContentPane().add(scrolltext);
frame.setVisible(true);
}
public void updateTable() {
busData = new Object[vehicles.size()][6];
for (int i = 0; i < vehicles.size(); i++) {
busData[i][0] = vehicles.get(i).getUID();
if (vehicles.get(i).isMoving())
busData[i][1] = vehicles.get(i).getCurrentStreet().getName();
else busData[i][1] = "Not Moving";
busData[i][2] = vehicles.get(i).getCurrentLocation();
if (vehicles.get(i).getProgress() != null)
busData[i][3] = vehicles.get(i).getProgress();
else busData[i][3] = "%0";
busData[i][4] = vehicles.get(i).getTripTime();
if (vehicles.get(i).isArrivedToDest())
busData[i][5] = getShortTime(vehicles.get(i).getTimeOfArrival());
else busData[i][5] = "NOT Arrived";
}
table.setModel(new DefaultTableModel(busData ,busColNames));
}
public void updateVehicles(ArrayList<Vehicle> vehiclesDistrict) {
vehicles.clear();
vehicles.addAll(vehiclesDistrict);
lblDistrictValue.setText(((Bus)vehiclesDistrict.get(0)).getCampaign().getHotelDistrict().name());
lblDate.setText(currenttimeManager.toString());
updateTable();
}
private String getShortTime(Date time) {
Calendar cal = new GregorianCalendar();
cal.setTime(time);
return String.format("%02d:%02d", cal.get(Calendar.HOUR), cal.get(Calendar.MINUTE));
}
}

127
src/GUI_ViewRoute.java Normal file
View File

@ -0,0 +1,127 @@
import java.awt.Color;
import java.awt.Font;
import java.util.Date;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.JComboBox;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JTextField;
import javax.swing.JScrollBar;
public class GUI_ViewRoute {
JFrame frame;
private String[] routeColNames = {"Num", "Status", "Length","Capacity", "Best Time", "Used By"};
private Object[][] routeData;
private JTable table;
private Route[] stdRoute;
private Date currenttimeManager;
private ArrayList<Campaign> listOfCampaigns;
private JTextField txtStreets;
private JLabel lblDate;
private JLabel lblTime;
public GUI_ViewRoute(Route[] stdRoute, ArrayList<Campaign> listOfCampaigns, Date currenttimeManager) {
this.stdRoute = stdRoute;
this.listOfCampaigns = listOfCampaigns;
this.currenttimeManager = currenttimeManager;
makeFrame();
}
private void makeFrame() {
frame = new JFrame("Routes");
frame.getContentPane().setBackground(new Color(50,50,50));
frame.getContentPane().setForeground(new Color(0, 0, 0));
frame.setBounds(100,100,815,480);
frame.getContentPane().setLayout(null);
frame.setLocationRelativeTo(null);
routeData = new Object[stdRoute.length][6];
for (int i = 0; i < stdRoute.length; i++) {
routeData[i][0] = i;
routeData[i][1] = String.format("%s : %s",stdRoute[i].getHotelArea(),stdRoute[i].getMashier());
routeData[i][2] = stdRoute[i].getTotalLength();
routeData[i][3] = String.format("%.2f",stdRoute[i].capcity());
routeData[i][4] = stdRoute[i].getFastestTimeOfTravel(new Bus());
int count = 0;
for (Campaign campaign : listOfCampaigns)
if (campaign.getRoute() == stdRoute[i])
count += campaign.getVehicles().size();
routeData[i][5] = String.format("%d buses", count);
}
table = new JTable(routeData,routeColNames);
table.setModel(new DefaultTableModel(routeData,routeColNames));
table.getColumnModel().getColumn(0).setPreferredWidth(30);
table.getColumnModel().getColumn(1).setPreferredWidth(190);
table.getColumnModel().getColumn(2).setPreferredWidth(55);
table.getColumnModel().getColumn(3).setPreferredWidth(57);
table.getColumnModel().getColumn(5).setPreferredWidth(75);
table.setColumnSelectionAllowed(true);
table.setCellSelectionEnabled(true);
DefaultTableModel model = new DefaultTableModel();
model.setColumnIdentifiers(routeColNames);
ListSelectionModel model2 = table.getSelectionModel();
model2.addListSelectionListener(e -> {
int row = model2.getMinSelectionIndex();
String streets = "";
for (Street street : stdRoute[row].getStreets())
streets += street.getName().name() +" >> ";
if (stdRoute[row].getMashier() == Mashier.ARAFAT)
txtStreets.setText(stdRoute[row].getHotelArea().name()+" >> "+streets+stdRoute[row].getMashier().name());
else txtStreets.setText(stdRoute[row].getMashier().name()+" >> "+streets+stdRoute[row].getHotelArea().name());
});
table.getTableHeader().setBackground(new Color(17,17,17));
table.getTableHeader().setFont(new Font("Rockwell", Font.PLAIN, 18));
table.getTableHeader().setForeground(Color.WHITE);
table.setBackground(new Color(17,17,17));
table.setForeground(Color.WHITE);
table.setGridColor(new Color(102, 102, 102));
table.setFont(new Font("Rockwell", Font.PLAIN, 18));
table.setRowHeight(25);
table.setAutoCreateRowSorter(true);
table.revalidate();
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBounds(10, 44, 755, 300);
frame.getContentPane().add(scrollPane);
txtStreets = new JTextField("Select Route");
txtStreets.setBackground(Color.BLACK);
txtStreets.setForeground(Color.WHITE);
txtStreets.setFont(new Font("Rockwell", Font.PLAIN, 17));
txtStreets.setBounds(10, 382, 755, 48);
frame.getContentPane().add(txtStreets);
txtStreets.setColumns(10);
lblTime = new JLabel("Time:");
lblTime.setForeground(Color.WHITE);
lblTime.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblTime.setBounds(10, 11, 72, 20);
frame.getContentPane().add(lblTime);
lblDate = new JLabel(currenttimeManager.toString());
lblDate.setForeground(Color.WHITE);
lblDate.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDate.setBounds(61, 11, 326, 20);
frame.getContentPane().add(lblDate);
JLabel lblStreets = new JLabel("Streets :");
lblStreets.setForeground(Color.WHITE);
lblStreets.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblStreets.setBounds(10, 355, 72, 20);
frame.getContentPane().add(lblStreets);
frame.setVisible(true);
}
}

272
src/GUI_ViewStreet.java Normal file
View File

@ -0,0 +1,272 @@
import java.awt.Color;
import java.awt.Font;
import java.util.Calendar;
import java.util.Date;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.JList;
import javax.swing.AbstractListModel;
import javax.swing.JTextField;
import javax.swing.JLabel;
public class GUI_ViewStreet {
private JFrame frame;
private Street street;
private ArrayList<Vehicle> vehicles = new ArrayList<>();
private Street[] stdStreet = new Street[StreetNames.values().length];
private Date currenttimeManager;
private Object[][] vehicleData;
private String[] vehicleColNames = {"ID", "District", "location","Progress", "trip time"};
private JTable table;
private JLabel lblCapcityValue;
private JLabel lblDate;
private JLabel lblLanesValue;
private JLabel lblNumVehicles;
private JLabel lblLengthValue;
private JTextField txtLow;
private JTextField[] textFieldArray = new JTextField[20];
private JTextField txtHigh;
public GUI_ViewStreet(Street[] streets, Date currenttimeManager) {
stdStreet = streets.clone();
this.currenttimeManager = (Date) currenttimeManager.clone();
makeFrame();
}
private void makeFrame() {
//street = stdStreet[0];
frame = new JFrame("Streets");
frame.getContentPane().setBackground(new Color(50,50,50));
frame.getContentPane().setForeground(new Color(0, 0, 0));
frame.setBounds(100,100,815,480);
frame.getContentPane().setLayout(null);
frame.setLocationRelativeTo(null);
vehicleData = new Object[vehicles.size()][6];
for (int i = 0; i < vehicles.size(); i++) {
vehicleData[i][0] = vehicles.get(i).getUID();
if (vehicles.get(i) instanceof Bus)
vehicleData[i][1] = ((Bus)vehicles.get(i)).getCampaign().getHotelDistrict().name();
else vehicleData[i][1] = "Local Vehicle";
vehicleData[i][2] = vehicles.get(i).getCurrentLocation();
vehicleData[i][3] = vehicles.get(i).getProgress();
vehicleData[i][4] = vehicles.get(i).getTripTime();
}
table = new JTable(vehicleData,vehicleColNames);
table.setColumnSelectionAllowed(true);
table.setCellSelectionEnabled(true);
DefaultTableModel model = new DefaultTableModel();
model.setColumnIdentifiers(vehicleColNames);
table.getTableHeader().setBackground(new Color(17,17,17));
table.getTableHeader().setFont(new Font("Rockwell", Font.PLAIN, 18));
table.getTableHeader().setForeground(Color.WHITE);
table.setModel(new DefaultTableModel(vehicleData ,vehicleColNames));
table.setBackground(new Color(17,17,17));
table.setForeground(Color.WHITE);
table.setGridColor(new Color(102, 102, 102));
table.setFont(new Font("Rockwell", Font.PLAIN, 18));
table.setRowHeight(25);
table.setAutoCreateRowSorter(true);
table.revalidate();
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBounds(10, 194, 755, 236);
frame.getContentPane().add(scrollPane);
JList list = new JList();
list.setFont(new Font("Tahoma", Font.PLAIN, 14));
list.setBackground(Color.GRAY);
list.setModel(new AbstractListModel() {
Street[] streets = stdStreet;
public int getSize() {
return stdStreet.length;
}
public Object getElementAt(int index) {
return streets[index].getName().name();
}
});
list.addListSelectionListener(
new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
street = stdStreet[list.getSelectedIndex()];
vehicles = street.getVehicles();
updateTable();
for (int i = 0; i < textFieldArray.length; i++) {
int colorFactor = (int)((1-capcityPoint(i))*255);
textFieldArray[i].setBackground(new Color(255,colorFactor,0));
}
lblCapcityValue.setText(String.format("%%%d", street.getPercentRemainingCapacity()));
lblDate.setText(currenttimeManager.toString());
lblNumVehicles.setText(String.format("%d", street.getVehicles().size()));
lblLengthValue.setText(String.format("%.2f", street.getLength()));
lblLanesValue.setText(String.format("%d", street.getNumberOfLanes()));
}
});
list.setBounds(10, 11, 118, 146);
JScrollPane scrollList = new JScrollPane(list);
scrollList.setBounds(10, 11, 173, 172);
frame.getContentPane().add(scrollList);
txtLow = new JTextField("Low");
txtLow.setFont(new Font("Rockwell", Font.BOLD, 13));
txtLow.setDisabledTextColor(Color.BLACK);
txtLow.setEnabled(false);
txtLow.setEditable(false);
txtLow.setBackground(Color.YELLOW);
txtLow.setBounds(710, 105, 40, 20);
frame.getContentPane().add(txtLow);
txtHigh = new JTextField("High");
txtHigh.setFont(new Font("Rockwell", Font.BOLD, 13));
txtHigh.setDisabledTextColor(Color.BLACK);
txtHigh.setEnabled(false);
txtHigh.setEditable(false);
txtHigh.setColumns(0);
txtHigh.setBackground(Color.RED);
txtHigh.setBounds(710, 80, 40, 20);
frame.getContentPane().add(txtHigh);
JLabel lblTime = new JLabel("Time:");
lblTime.setForeground(Color.WHITE);
lblTime.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblTime.setBounds(193, 11, 72, 20);
frame.getContentPane().add(lblTime);
lblDate = new JLabel(currenttimeManager.toString());
lblDate.setForeground(Color.WHITE);
lblDate.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDate.setBounds(243, 11, 326, 20);
frame.getContentPane().add(lblDate);
JLabel lblStatus = new JLabel("Status:");
lblStatus.setForeground(Color.WHITE);
lblStatus.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblStatus.setBounds(511, 11, 72, 20);
frame.getContentPane().add(lblStatus);
JLabel lblDestination = new JLabel();
lblDestination.setForeground(Color.WHITE);
lblDestination.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDestination.setBounds(568, 11, 184, 20);
Calendar cal = new GregorianCalendar();
cal.setTime(currenttimeManager);
if (cal.get(Calendar.DAY_OF_MONTH) == 9)
lblDestination.setText("Heading to Arafat");
else lblDestination.setText("Heading to Hotels");
frame.getContentPane().add(lblDestination);
JLabel lblCapcity = new JLabel("Capcity:");
lblCapcity.setForeground(Color.WHITE);
lblCapcity.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblCapcity.setBounds(193, 45, 72, 20);
frame.getContentPane().add(lblCapcity);
lblCapcityValue = new JLabel();
lblCapcityValue.setForeground(Color.WHITE);
lblCapcityValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblCapcityValue.setBounds(258, 45, 48, 20);
frame.getContentPane().add(lblCapcityValue);
JLabel lblVehicles = new JLabel("Vehicles: ");
lblVehicles.setForeground(Color.WHITE);
lblVehicles.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblVehicles.setBounds(370, 45, 72, 20);
frame.getContentPane().add(lblVehicles);
lblNumVehicles = new JLabel();
lblNumVehicles.setForeground(Color.WHITE);
lblNumVehicles.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblNumVehicles.setBounds(441, 45, 61, 20);
frame.getContentPane().add(lblNumVehicles);
JLabel lblLength = new JLabel("Length:");
lblLength.setForeground(Color.WHITE);
lblLength.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblLength.setBounds(193, 85, 61, 20);
frame.getContentPane().add(lblLength);
lblLengthValue = new JLabel();
lblLengthValue.setForeground(Color.WHITE);
lblLengthValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblLengthValue.setBounds(253, 85, 93, 20);
frame.getContentPane().add(lblLengthValue);
JLabel lblLanes = new JLabel("Lanes");
lblLanes.setForeground(Color.WHITE);
lblLanes.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblLanes.setBounds(370, 85, 61, 20);
frame.getContentPane().add(lblLanes);
lblLanesValue = new JLabel();
lblLanesValue.setForeground(Color.WHITE);
lblLanesValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblLanesValue.setBounds(431, 85, 26, 20);
frame.getContentPane().add(lblLanesValue);
JLabel lbl100 = new JLabel();
lbl100.setText("%100");
lbl100.setForeground(Color.WHITE);
lbl100.setFont(new Font("Rockwell", Font.PLAIN, 16));
lbl100.setBounds(715, 170, 45, 15);
frame.getContentPane().add(lbl100);
JLabel lbl0 = new JLabel();
lbl0.setText("%0");
lbl0.setForeground(Color.WHITE);
lbl0.setFont(new Font("Rockwell", Font.PLAIN, 16));
lbl0.setBounds(193, 170, 25, 15);
frame.getContentPane().add(lbl0);
JLabel lblCapcityPoint = new JLabel("CapcityPoint:");
lblCapcityPoint.setForeground(Color.WHITE);
lblCapcityPoint.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblCapcityPoint.setBounds(193, 120, 101, 20);
frame.getContentPane().add(lblCapcityPoint);
for (int i = 0; i < textFieldArray.length; i++) {
textFieldArray[i] = new JTextField();
textFieldArray[i].setEnabled(false);
textFieldArray[i].setEditable(false);
textFieldArray[i].setBackground(new Color(70, 70, 70));
textFieldArray[i].setBounds(190+i*28, 142, 28, 20);
frame.getContentPane().add(textFieldArray[i]);
textFieldArray[i].setColumns(0);
}
frame.setVisible(true);
}
public void updateTable() {
if (vehicles.isEmpty()) return;
vehicleData = new Object[vehicles.size()][6];
for (int i = 0; i < vehicles.size(); i++) {
vehicleData[i][0] = vehicles.get(i).getUID();// TODO: There is an Exception error here;
if (vehicles.get(i) instanceof Bus)
vehicleData[i][1] = ((Bus)vehicles.get(i)).getCampaign().getHotelDistrict().name();
else vehicleData[i][1] = "Local Vehicle";
vehicleData[i][2] = vehicles.get(i).getCurrentLocation();
vehicleData[i][3] = vehicles.get(i).getProgress();
vehicleData[i][4] = vehicles.get(i).getTripTime();
}
table.setModel(new DefaultTableModel(vehicleData ,vehicleColNames));
}
public double capcityPoint(int x) {
double part = street.getLength()/20;
double capcity = street.capcityPoint(x*part, (x+1)*part);
return capcity;
}
}

18
src/HijriDate.java Normal file
View File

@ -0,0 +1,18 @@
import java.util.Date;
/**
* Class to be used in Hajj-sim. Overrides toString()
* Incomplete.
*/
class HijriDate extends Date {
public HijriDate(long timeInMillis) {
super(timeInMillis);
}
@Override
public String toString(){
return super.toString().replaceAll("Jan","Dhu'l-Hijja")
.replaceAll("AST", "");
}
}

46
src/InputListener.java Normal file
View File

@ -0,0 +1,46 @@
import java.util.Scanner;
public class InputListener implements Runnable {
private volatile String input = "";
private volatile boolean hasNew;
private volatile boolean pause;
private final Scanner in;
private boolean stop;
public InputListener() {
in = new Scanner(System.in);
}
@Override
public void run() {
while(!stop) {
if (!pause){
input = in.next();
hasNew = true;
}
}
System.out.println("Stopped input listener");
}
public void stop() {
stop = true;
}
public String getInput() {
hasNew = false;
return input;
}
public boolean hasNew() {
return hasNew;
}
public void pause() {
pause = true;
}
public void unpause() {
pause = false;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -35,15 +35,15 @@ public class PDate extends Calendar {
} }
public Date getStartTime() { public Date getStartTime() {
return startCalendar.getTime(); return new HijriDate(startCalendar.getTimeInMillis());
} }
public Date getEndTime(){ public Date getEndTime(){
return endCalendar.getTime(); return new HijriDate(endCalendar.getTimeInMillis());
} }
public Date getCurrentTime() { public Date getCurrentTime() {
return currentCalendar.getTime(); return new HijriDate(currentCalendar.getTimeInMillis());
} }
public void step(int key, int value){ public void step(int key, int value){

View File

@ -1,4 +1,6 @@
public class Route { import java.io.Serializable;
public class Route implements Travelable, Serializable {
private Street[] streets; private Street[] streets;
private District hotelArea; private District hotelArea;
@ -38,17 +40,20 @@ public class Route {
double totalLength = getTotalLength(); double totalLength = getTotalLength();
int maxSpeed = vehicle.getMaxSpeed(); int maxSpeed = vehicle.getMaxSpeed();
int totalTime = (int) (totalLength/maxSpeed); int totalTime = (int) (totalLength/maxSpeed);
String result = String.format("%2d:%2d",totalTime % 60, totalTime /60); String result = String.format("%02d:%02d",totalTime / 60, totalTime % 60);
return result; return result;
} }
@Override
public String toString() { public String toString() {
StringBuilder s = new StringBuilder(); StringBuilder s = new StringBuilder();
s.append(super.toString()) s.append(super.toString())
.append("\n").append(String.format("%s:%s",getHotelArea().name(),getMashier().name())) .append("\n").append(String.format("%s:%s",getHotelArea(),getMashier()))
.append("\n") .append("\n")
.append("Length: ").append(getTotalLength()) .append("Length: ").append(getTotalLength())
.append("\n") .append("\n")
.append("Capacity: ").append(String.format("%.2f", capcity()))
.append("\n")
.append("Streets: "); .append("Streets: ");
for (Street street : this.getStreets()) for (Street street : this.getStreets())
s.append(street.getName().name()).append(" "); s.append(street.getName().name()).append(" ");
@ -64,6 +69,15 @@ public class Route {
return mashier; return mashier;
} }
public double capcity() {
double capcity = 0;
for (Street str : getStreets()) {
capcity += str.getPercentRemainingCapacity();
}
double c = capcity/(getStreets().length);
return c;
}
private void setStreets(Street[] streets) { private void setStreets(Street[] streets) {
if (streets != null) this.streets = streets; if (streets != null) this.streets = streets;
else throwIllegal(); else throwIllegal();

View File

@ -1,10 +1,13 @@
import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
public class Street { public class Street implements Travelable, Serializable {
private double length; private double length;
private int numberOfLanes; private int numberOfLanes;
private ArrayList<Vehicle> vehicles; private ArrayList<Vehicle> vehicles; //Current
private StreetNames name; private StreetNames name;
@ -57,18 +60,18 @@ public class Street {
for(int i=0;i<vehicles.size();i++) { for(int i=0;i<vehicles.size();i++) {
totalLenthofCar+=vehicles.get(i).getVehicleSize(); totalLenthofCar+=vehicles.get(i).getVehicleSize();
} }
// int percent = 0; int percent = 0;
// if (totalLenthofCar > totalLength){ if (totalLenthofCar > totalLength){
// percent = (int) (totalLength/totalLenthofCar); percent = (int) (totalLength/totalLenthofCar);
// percent *= 100; percent *= 100;
// percent += totalLength - (totalLength % totalLenthofCar); percent += totalLength - (totalLength % totalLenthofCar);
// } }
// else { else {
// percent = (int)(totalLength - totalLenthofCar); percent = (int)(totalLength - totalLenthofCar);
// } }
//
// return percent; return percent;
return totalLength - totalLenthofCar; //return totalLength - totalLenthofCar;
} }
public int getPercentRemainingCapacity() { public int getPercentRemainingCapacity() {
@ -83,10 +86,7 @@ public class Street {
} }
public void addVehicle(Vehicle vehicle) { public void addVehicle(Vehicle vehicle) {
//if(capcity() > vehicle.getVehicleSize() + 0.5) { vehicles.add(vehicle);
//adds incoming vehicle in last.
vehicles.add(vehicle);
//}
} }
public double capcityPoint(double min, double max) { public double capcityPoint(double min, double max) {
@ -130,15 +130,13 @@ public class Street {
return capcity; return capcity;
} }
public Street getNextStreet(Vehicle vehicle) { public Street getNextStreet(Vehicle vehicle) {
int nextIndex = vehicle.getRoute().indexOf(vehicle.getCurrentStreet()) +1 ; int nextIndex = vehicle.getRoute().indexOf(vehicle.getCurrentStreet()) +1 ;
if(vehicle.getRoute().getStreets().length > nextIndex) if(vehicle.getRoute().getStreets().length > nextIndex)
return (vehicle.getRoute().getStreets()[nextIndex]); return (vehicle.getRoute().getStreets()[nextIndex]);
else else
return null; return null;
}
}
public int getNumberOfBuses() { public int getNumberOfBuses() {
int number = 0; int number = 0;
@ -155,4 +153,50 @@ public class Street {
} }
return number; return number;
} }
public String toString(){
StringBuilder printedStreet = new StringBuilder();
//Imagine steert is 32 units in lengths (scale down)
for (int i = 0; i < 32; i++){
printedStreet.append("----");
}
printedStreet.append("\n");
//This is vary bad. Should copy vehicles list and reduce when a vehicle is counted;
for (int i = 0; i < 32; i++){
int cars = 0;
for (Vehicle vehicle : vehicles){
double realLocation = vehicle.getCurrentLocation();
int scaledLocation = (int)((realLocation*32) / this.length);
if (scaledLocation == i) cars++;
}
//if 'cars' is 4 digits or more it will distort the output
printedStreet.append(String.format("%03d ", cars));
}
printedStreet.append("\n");
for (int i = 0; i < 32; i++){
printedStreet.append("----");
}
return String.format("Street name: %s, Length: %.2f, Lanes: %d, Vehicles: %d, Capacity: %%%s\nDensity:\n%s\n",
name.name(),
length,
numberOfLanes,
vehicles.size(),
getPercentRemainingCapacity(),
printedStreet.toString());
}
public boolean isContainsBuses() {
for (Vehicle vehicle : this.vehicles) {
if (vehicle instanceof Bus)
return true;
}
return false;
}
public String getFastestTimeOfTravel(Vehicle vehicle) {
double totalLength = length;
int maxSpeed = vehicle.getMaxSpeed();
int totalTime = (int) (totalLength/maxSpeed);
return String.format("%02d:%02d",totalTime / 60, totalTime % 60);
}
} }

View File

@ -28,4 +28,9 @@ public class TrafficPoliceCar extends Vehicle implements CanBeGovtCar, CanFixAcc
public int getMaxSpeed() { public int getMaxSpeed() {
return Sedan.MAX_FORWARD; return Sedan.MAX_FORWARD;
} }
@Override
public String getUID() {
return TPC_UID;
}
} }

3
src/Travelable.java Normal file
View File

@ -0,0 +1,3 @@
public interface Travelable {
String getFastestTimeOfTravel(Vehicle vehicle);
}

View File

@ -1,7 +1,8 @@
import java.io.Serializable;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
public abstract class Vehicle { public abstract class Vehicle implements Serializable {
private double vehicleSize; private double vehicleSize;
private Route route; private Route route;
@ -13,11 +14,14 @@ public abstract class Vehicle {
private Date timeStartedMoving; private Date timeStartedMoving;
private Date timeOfArrival; private Date timeOfArrival;
private Date timeStartedOnCurrentStreet; private Date timeStartedOnCurrentStreet;
private static Vehicle max;
private static Vehicle min;
//Map Street to Minutes //Map Street to Minutes
private HashMap<Street, Integer> routeTimeHistory = new HashMap<>(); private HashMap<Street, Integer> routeTimeHistory = new HashMap<>();
public abstract int getMaxSpeed(); public abstract int getMaxSpeed();
public abstract String getUID();
public Vehicle(double vehicleSize){ public Vehicle(double vehicleSize){
setVehicleSize(vehicleSize); setVehicleSize(vehicleSize);
@ -37,8 +41,68 @@ public abstract class Vehicle {
setTimeOfArrival(MakkahCity.getTimeMan().getCurrentTime()); setTimeOfArrival(MakkahCity.getTimeMan().getCurrentTime());
getCurrentStreet().getVehicles().remove(this); getCurrentStreet().getVehicles().remove(this);
this.currentLocation = 0; this.currentLocation = 0;
maxArrived();
minArrived();
if (totalDistanceTraveled > route.getTotalLength()) totalDistanceTraveled = route.getTotalLength();
} }
public void maxArrived() {
if (this instanceof Bus) {
if (max == null)
max = this;
else {
long thisMinutes = (getTimeOfArrival().getTime() - getTimeStartedMoving().getTime())/60000;
long maxMinutes = (max.getTimeOfArrival().getTime() - max.getTimeStartedMoving().getTime())/60000;
if (thisMinutes > maxMinutes)
max = this;
}
}
}
public void minArrived() {
if (this instanceof Bus) {
if (min == null)
min = this;
else {
long thisMinutes = (getTimeOfArrival().getTime() - getTimeStartedMoving().getTime())/60000;
long maxMinutes = (min.getTimeOfArrival().getTime() - min.getTimeStartedMoving().getTime())/60000;
if (thisMinutes < maxMinutes)
min = this;
}
}
}
public String timeToString() {
if (this == null)
return "null";
else {
long minutes = (getTimeOfArrival().getTime() - getTimeStartedMoving().getTime())/60000;
int hours =(int) minutes / 60;
minutes %= 60;
return String.format("%2d:%02d", hours,minutes);}
}
public static Vehicle getMaxArrived() {
return max;
}
public static Vehicle getMinArrived() {
return min;
}
public static void resetMaxArrived() {
Vehicle.max = null;
}
public static void resetMinArrived() {
Vehicle.min = null;
}
public void move(double distance) { public void move(double distance) {
if (!isMoving()) { if (!isMoving()) {
setMoving(true); setMoving(true);
@ -52,6 +116,9 @@ public abstract class Vehicle {
this.route = route; this.route = route;
this.arrivedToDest = false; this.arrivedToDest = false;
this.routeTimeHistory.clear(); this.routeTimeHistory.clear();
this.timeStartedOnCurrentStreet = null;
this.timeStartedMoving = null;
this.timeOfArrival = null;
} }
private void setVehicleSize(double vehicleSize) { private void setVehicleSize(double vehicleSize) {
@ -163,10 +230,38 @@ public abstract class Vehicle {
return 0; return 0;
} }
public String getProgress() {
int p = (int)((totalDistanceTraveled/route.getTotalLength())*100);
if (p > 100) p = 100;
return String.format("%%%d", p);
}
public String getTripTime() {
long minutes = 0;
if (timeStartedMoving != null && timeOfArrival != null){
minutes = (getTimeOfArrival().getTime() - getTimeStartedMoving().getTime())/60000;
}
else if (timeStartedMoving != null) { //compare to now
minutes = (MakkahCity.getTimeMan().getCurrentTime().getTime() - getTimeStartedMoving().getTime())/60000;
}
return String.format("%d:%02d", minutes /60, minutes % 60);
}
public boolean hasCrossedStreet(Street street) { public boolean hasCrossedStreet(Street street) {
return routeTimeHistory.containsKey(street); return routeTimeHistory.containsKey(street);
} }
public String toString() {
Street st = this.currentStreet;
String streetString = "null";
if (st != null) streetString = st.getName().name();
return String.format("\nRoute: %s\nStreet: %s, Location: %.1f, Distance covered: %.1f, Progress: %s\n" +
"Arrived: %s\nStarting time: %s\nArrive Time: %s\nTrip time: %s\n",
this.route, streetString,
this.getCurrentLocation(), this.totalDistanceTraveled, getProgress(), this.isArrivedToDest(),
this.getTimeStartedMoving(), this.getTimeOfArrival(), getTripTime());
}
} }