diff --git a/MEMBER.md b/MEMBER.md
new file mode 100644
index 00000000..16aa1cb9
--- /dev/null
+++ b/MEMBER.md
@@ -0,0 +1,3 @@
+13510015 Wilson_Fonda wilsonfonda@gmail.com wilsonfonda
+13510059 Yulianti_Oenang 13510059@std.stei.itb.ac.id YuliantiOenang
+13510073 Kevin_Winata kevinwinata@gmail.com kevinwinata
\ No newline at end of file
diff --git a/Server/build.xml b/Server/build.xml
new file mode 100644
index 00000000..fa80ae64
--- /dev/null
+++ b/Server/build.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+ Builds, tests, and runs the project Server.
+
+
+
diff --git a/Server/build/built-jar.properties b/Server/build/built-jar.properties
new file mode 100644
index 00000000..1f29b94a
--- /dev/null
+++ b/Server/build/built-jar.properties
@@ -0,0 +1,4 @@
+#Tue, 21 May 2013 08:58:12 +0700
+
+
+C\:\\Users\\Yulianti\ Oenang\\Desktop\\Tubes\ 5\ Final\\Server=
diff --git a/Server/build/classes/model/Tugas.class b/Server/build/classes/model/Tugas.class
new file mode 100644
index 00000000..b6e425aa
Binary files /dev/null and b/Server/build/classes/model/Tugas.class differ
diff --git a/Server/build/classes/server/DbOperation.class b/Server/build/classes/server/DbOperation.class
new file mode 100644
index 00000000..8866ab6b
Binary files /dev/null and b/Server/build/classes/server/DbOperation.class differ
diff --git a/Server/build/classes/server/Server.class b/Server/build/classes/server/Server.class
new file mode 100644
index 00000000..23b0239b
Binary files /dev/null and b/Server/build/classes/server/Server.class differ
diff --git a/Server/dist/README.TXT b/Server/dist/README.TXT
new file mode 100644
index 00000000..29a24d32
--- /dev/null
+++ b/Server/dist/README.TXT
@@ -0,0 +1,32 @@
+========================
+BUILD OUTPUT DESCRIPTION
+========================
+
+When you build an Java application project that has a main class, the IDE
+automatically copies all of the JAR
+files on the projects classpath to your projects dist/lib folder. The IDE
+also adds each of the JAR files to the Class-Path element in the application
+JAR files manifest file (MANIFEST.MF).
+
+To run the project from the command line, go to the dist folder and
+type the following:
+
+java -jar "Server.jar"
+
+To distribute this project, zip up the dist folder (including the lib folder)
+and distribute the ZIP file.
+
+Notes:
+
+* If two JAR files on the project classpath have the same name, only the first
+JAR file is copied to the lib folder.
+* Only JAR files are copied to the lib folder.
+If the classpath contains other types of files or folders, these files (folders)
+are not copied.
+* If a library on the projects classpath also has a Class-Path element
+specified in the manifest,the content of the Class-Path element has to be on
+the projects runtime path.
+* To set a main class in a standard Java project, right-click the project node
+in the Projects window and choose Properties. Then click Run and enter the
+class name in the Main Class field. Alternatively, you can manually type the
+class name in the manifest Main-Class element.
diff --git a/Server/dist/Server.jar b/Server/dist/Server.jar
new file mode 100644
index 00000000..8bbcf410
Binary files /dev/null and b/Server/dist/Server.jar differ
diff --git a/Server/dist/lib/mysql-connector-java-5.1.13-bin.jar b/Server/dist/lib/mysql-connector-java-5.1.13-bin.jar
new file mode 100644
index 00000000..795c6985
Binary files /dev/null and b/Server/dist/lib/mysql-connector-java-5.1.13-bin.jar differ
diff --git a/Server/manifest.mf b/Server/manifest.mf
new file mode 100644
index 00000000..328e8e5b
--- /dev/null
+++ b/Server/manifest.mf
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+X-COMMENT: Main-Class will be added automatically by build
+
diff --git a/Server/nbproject/build-impl.xml b/Server/nbproject/build-impl.xml
new file mode 100644
index 00000000..0d9a3c5d
--- /dev/null
+++ b/Server/nbproject/build-impl.xml
@@ -0,0 +1,1053 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must set src.dir
+ Must set test.src.dir
+ Must set build.dir
+ Must set dist.dir
+ Must set build.classes.dir
+ Must set dist.javadoc.dir
+ Must set build.test.classes.dir
+ Must set build.test.results.dir
+ Must set build.classes.excludes
+ Must set dist.jar
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must set javac.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must set JVM to use for profiling in profiler.info.jvm
+ Must set profiler agent JVM arguments in profiler.info.jvmargs.agent
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select some files in the IDE or set javac.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ To run this application from the command line without Ant, try:
+
+
+
+
+
+
+ java -cp "${run.classpath.with.dist.jar}" ${main.class}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ To run this application from the command line without Ant, try:
+
+ java -jar "${dist.jar.resolved}"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set debug.class
+
+
+
+
+ Must select one file in the IDE or set debug.class
+
+
+
+
+ Must set fix.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set profile.class
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select some files in the IDE or set javac.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Some tests failed; see details above.
+
+
+
+
+
+
+
+
+ Must select some files in the IDE or set test.includes
+
+
+
+ Some tests failed; see details above.
+
+
+
+
+ Must select one file in the IDE or set test.class
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set applet.url
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set applet.url
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Server/nbproject/genfiles.properties b/Server/nbproject/genfiles.properties
new file mode 100644
index 00000000..1b8de5c8
--- /dev/null
+++ b/Server/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=6f248d50
+build.xml.script.CRC32=5a7fa1ba
+build.xml.stylesheet.CRC32=28e38971@1.44.1.45
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=6f248d50
+nbproject/build-impl.xml.script.CRC32=ca045364
+nbproject/build-impl.xml.stylesheet.CRC32=fcddb364@1.50.2.46
diff --git a/Server/nbproject/private/private.properties b/Server/nbproject/private/private.properties
new file mode 100644
index 00000000..5e2ea25f
--- /dev/null
+++ b/Server/nbproject/private/private.properties
@@ -0,0 +1,2 @@
+compile.on.save=true
+user.properties.file=C:\\Users\\Yulianti Oenang\\.netbeans\\7.0\\build.properties
diff --git a/Server/nbproject/private/private.xml b/Server/nbproject/private/private.xml
new file mode 100644
index 00000000..c1f155a7
--- /dev/null
+++ b/Server/nbproject/private/private.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/Server/nbproject/project.properties b/Server/nbproject/project.properties
new file mode 100644
index 00000000..a961e6e1
--- /dev/null
+++ b/Server/nbproject/project.properties
@@ -0,0 +1,72 @@
+annotation.processing.enabled=true
+annotation.processing.enabled.in.editor=false
+annotation.processing.processor.options=
+annotation.processing.processors.list=
+annotation.processing.run.all.processors=true
+annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
+build.classes.dir=${build.dir}/classes
+build.classes.excludes=**/*.java,**/*.form
+# This directory is removed when the project is cleaned:
+build.dir=build
+build.generated.dir=${build.dir}/generated
+build.generated.sources.dir=${build.dir}/generated-sources
+# Only compile against the classpath explicitly listed here:
+build.sysclasspath=ignore
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+# Uncomment to specify the preferred debugger connection transport:
+#debug.transport=dt_socket
+debug.classpath=\
+ ${run.classpath}
+debug.test.classpath=\
+ ${run.test.classpath}
+# This directory is removed when the project is cleaned:
+dist.dir=dist
+dist.jar=${dist.dir}/Server.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+excludes=
+includes=**
+jar.compress=false
+javac.classpath=\
+ ${libs.MySQLDriver.classpath}
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.deprecation=false
+javac.processorpath=\
+ ${javac.classpath}
+javac.source=1.6
+javac.target=1.6
+javac.test.classpath=\
+ ${javac.classpath}:\
+ ${build.classes.dir}
+javac.test.processorpath=\
+ ${javac.test.classpath}
+javadoc.additionalparam=
+javadoc.author=false
+javadoc.encoding=${source.encoding}
+javadoc.noindex=false
+javadoc.nonavbar=false
+javadoc.notree=false
+javadoc.private=false
+javadoc.splitindex=true
+javadoc.use=true
+javadoc.version=false
+javadoc.windowtitle=
+main.class=server.Server
+manifest.file=manifest.mf
+meta.inf.dir=${src.dir}/META-INF
+mkdist.disabled=false
+platform.active=default_platform
+run.classpath=\
+ ${javac.classpath}:\
+ ${build.classes.dir}
+# Space-separated list of JVM arguments used when running the project
+# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
+# or test-sys-prop.name=value to set system properties for unit tests):
+run.jvmargs=
+run.test.classpath=\
+ ${javac.test.classpath}:\
+ ${build.test.classes.dir}
+source.encoding=UTF-8
+src.dir=src
+test.src.dir=test
diff --git a/Server/nbproject/project.xml b/Server/nbproject/project.xml
new file mode 100644
index 00000000..61113d04
--- /dev/null
+++ b/Server/nbproject/project.xml
@@ -0,0 +1,15 @@
+
+
+ org.netbeans.modules.java.j2seproject
+
+
+ Server
+
+
+
+
+
+
+
+
+
diff --git a/Server/src/model/Tugas.java b/Server/src/model/Tugas.java
new file mode 100644
index 00000000..bdec45e0
--- /dev/null
+++ b/Server/src/model/Tugas.java
@@ -0,0 +1,134 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package model;
+
+import java.util.Date;
+
+/**
+ *
+ * @author TOSHIBA
+ */
+public class Tugas implements java.io.Serializable {
+ private int id;
+ private String nama;
+ private Date deadline;
+ private String kategori;
+ private String assignee;
+ private String tag;
+ private boolean status;
+ private long last_mod;
+
+ /**
+ * @return the id
+ */
+ public int getId() {
+ return id;
+ }
+
+ /**
+ * @param id the id to set
+ */
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ /**
+ * @return the nama
+ */
+ public String getNama() {
+ return nama;
+ }
+
+ /**
+ * @param nama the nama to set
+ */
+ public void setNama(String nama) {
+ this.nama = nama;
+ }
+
+ /**
+ * @return the deadline
+ */
+ public Date getDeadline() {
+ return deadline;
+ }
+
+ /**
+ * @param deadline the deadline to set
+ */
+ public void setDeadline(Date deadline) {
+ this.deadline = deadline;
+ }
+
+ /**
+ * @return the kategori
+ */
+ public String getKategori() {
+ return kategori;
+ }
+
+ /**
+ * @param kategori the kategori to set
+ */
+ public void setKategori(String kategori) {
+ this.kategori = kategori;
+ }
+
+ /**
+ * @return the assignee
+ */
+ public String getAssignee() {
+ return assignee;
+ }
+
+ /**
+ * @param assignee the assignee to set
+ */
+ public void setAssignee(String assignee) {
+ this.assignee = assignee;
+ }
+
+ /**
+ * @return the tag
+ */
+ public String getTag() {
+ return tag;
+ }
+
+ /**
+ * @param tag the tag to set
+ */
+ public void setTag(String tag) {
+ this.tag = tag;
+ }
+
+ /**
+ * @return the status
+ */
+ public boolean isStatus() {
+ return status;
+ }
+
+ /**
+ * @param status the status to set
+ */
+ public void setStatus(boolean status) {
+ this.status = status;
+ }
+
+ /**
+ * @return the last_mod
+ */
+ public long getLast_mod() {
+ return last_mod;
+ }
+
+ /**
+ * @param last_mod the last_mod to set
+ */
+ public void setLast_mod(long last_mod) {
+ this.last_mod = last_mod;
+ }
+}
diff --git a/Server/src/server/DbOperation.java b/Server/src/server/DbOperation.java
new file mode 100644
index 00000000..9a56e524
--- /dev/null
+++ b/Server/src/server/DbOperation.java
@@ -0,0 +1,171 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package server;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import model.Tugas;
+
+/**
+ *
+ * @author TOSHIBA
+ */
+public class DbOperation {
+
+ private Connection connection;
+
+ public DbOperation() {
+ try {
+ Properties prop = new Properties();
+ Class.forName("com.mysql.jdbc.Driver");
+ connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/progin_147_13510059", "progin", "progin");
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public boolean checkLogin(String username, String password) {
+ boolean ret = false;
+ try {
+ PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM users WHERE username=? and password=MD5(?)");
+ preparedStatement.setString(1, username);
+ preparedStatement.setString(2, password);
+ ResultSet rs = preparedStatement.executeQuery();
+ ret = rs.first();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return ret;
+ }
+
+ public List getTugas(String username) {
+ List tasks = new ArrayList();
+ try {
+ PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM tugas WHERE pemilik=?");
+ preparedStatement.setString(1, username);
+ ResultSet rs = preparedStatement.executeQuery();
+
+ while (rs.next()) {
+ Tugas tugas = new Tugas();
+ String id = rs.getString("id");
+
+ tugas.setId(Integer.parseInt(id));
+ tugas.setNama(rs.getString("nama"));
+ tugas.setDeadline(rs.getDate("tgl_deadline"));
+ tugas.setLast_mod(rs.getLong("last_mod"));
+ tugas.setStatus(rs.getBoolean("status"));
+
+ PreparedStatement tempStatement = connection.prepareStatement("SELECT nama FROM categories WHERE id=?");
+ tempStatement.setString(1, rs.getString("id_kategori"));
+ ResultSet temp = tempStatement.executeQuery();
+ temp.next();
+ tugas.setKategori(temp.getString("nama"));
+
+ PreparedStatement tempStatement1 = connection.prepareStatement("SELECT username FROM assignees WHERE id_tugas=?");
+ tempStatement1.setString(1, id);
+ ResultSet temp1 = tempStatement1.executeQuery();
+ StringBuilder assignee = new StringBuilder();
+ while (temp1.next()) {
+ assignee.append(temp1.getString("username"));
+ if (!temp1.isLast())
+ assignee.append(", ");
+ }
+ tugas.setAssignee(assignee.toString());
+
+ PreparedStatement tempStatement2 = connection.prepareStatement("SELECT tag FROM tags WHERE id_tugas=?");
+ tempStatement2.setString(1, id);
+ ResultSet temp2 = tempStatement2.executeQuery();
+ StringBuilder tag = new StringBuilder();
+ while (temp2.next()) {
+ tag.append(temp2.getString("tag"));
+ if (!temp2.isLast())
+ tag.append(", ");
+ }
+ tugas.setTag(tag.toString());
+ tasks.add(tugas);
+ }
+
+ PreparedStatement preparedStatement1 = connection.prepareStatement("SELECT tugas.* FROM tugas, assignees WHERE tugas.id = assignees.id_tugas AND assignees.username = ?");
+ preparedStatement1.setString(1, username);
+ ResultSet rs1 = preparedStatement1.executeQuery();
+
+ while (rs1.next()) {
+ Tugas tugas = new Tugas();
+ String id = rs1.getString("id");
+
+ tugas.setId(Integer.parseInt(id));
+ tugas.setNama(rs1.getString("nama"));
+ tugas.setDeadline(rs1.getDate("tgl_deadline"));
+ tugas.setLast_mod(rs1.getLong("last_mod"));
+ tugas.setStatus(rs1.getBoolean("status"));
+
+ PreparedStatement tempStatement = connection.prepareStatement("SELECT nama FROM categories WHERE id=?");
+ tempStatement.setString(1, rs1.getString("id_kategori"));
+ ResultSet temp = tempStatement.executeQuery();
+ temp.next();
+ tugas.setKategori(temp.getString("nama"));
+
+ PreparedStatement tempStatement1 = connection.prepareStatement("SELECT username FROM assignees WHERE id_tugas=?");
+ tempStatement1.setString(1, id);
+ ResultSet temp1 = tempStatement1.executeQuery();
+ StringBuilder assignee = new StringBuilder();
+ assignee.append(rs1.getString("pemilik")).append(", ");
+ while (temp1.next()) {
+ assignee.append(temp1.getString("username"));
+ if (!temp1.isLast())
+ assignee.append(", ");
+ }
+ tugas.setAssignee(assignee.toString());
+
+ PreparedStatement tempStatement2 = connection.prepareStatement("SELECT tag FROM tags WHERE id_tugas=?");
+ tempStatement2.setString(1, id);
+ ResultSet temp2 = tempStatement2.executeQuery();
+ StringBuilder tag = new StringBuilder();
+ while (temp2.next()) {
+ tag.append(temp2.getString("tag"));
+ if (!temp2.isLast())
+ tag.append(", ");
+ }
+ tugas.setTag(tag.toString());
+ tasks.add(tugas);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return tasks;
+ }
+
+ public void Update(int id, boolean status, long time) {
+ try {
+ PreparedStatement tempStatement = connection.prepareStatement("SELECT last_mod FROM tugas WHERE id=?");
+ tempStatement.setInt(1, id);
+ ResultSet temp = tempStatement.executeQuery();
+ temp.next();
+
+ if (temp.getLong("last_mod") < time) {
+ int stat = 0;
+ if (status) stat = 1;
+ PreparedStatement preparedStatement = connection.prepareStatement("UPDATE tugas SET STATUS = ?, last_mod = ? WHERE id =?");
+ // Parameters start with 1
+ preparedStatement.setInt(1, stat);
+ preparedStatement.setLong(2, time);
+ preparedStatement.setInt(3, id);
+ preparedStatement.executeUpdate();
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/Server/src/server/Server.java b/Server/src/server/Server.java
new file mode 100644
index 00000000..248ace51
--- /dev/null
+++ b/Server/src/server/Server.java
@@ -0,0 +1,95 @@
+package server;
+
+import java.io.*;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.SocketTimeoutException;
+import java.util.List;
+import model.Tugas;
+
+public class Server extends Thread {
+
+ private ServerSocket serverSocket;
+ private int port = 6066;
+ private static DbOperation db;
+
+ public Server() throws IOException {
+ serverSocket = new ServerSocket(port);
+ }
+
+ public byte[] serialize(Object obj) throws IOException {
+ ByteArrayOutputStream b = new ByteArrayOutputStream();
+ ObjectOutputStream o = new ObjectOutputStream(b);
+ o.writeObject(obj);
+ return b.toByteArray();
+ }
+
+ public Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
+ ByteArrayInputStream b = new ByteArrayInputStream(bytes);
+ ObjectInputStream o = new ObjectInputStream(b);
+ return o.readObject();
+ }
+
+ @Override
+ public void run() {
+ while (true) {
+ try {
+ System.out.println("Waiting for client on port "
+ + serverSocket.getLocalPort() + "...");
+ Socket server = serverSocket.accept();
+ System.out.println("Just connected to "
+ + server.getRemoteSocketAddress());
+ DataInputStream in =
+ new DataInputStream(server.getInputStream());
+
+ DataOutputStream out =
+ new DataOutputStream(server.getOutputStream());
+
+ String request = in.readUTF();
+ String[] split = request.split("#");
+ if (split[0].compareTo("login") == 0) {
+ if (db.checkLogin(split[1], split[2])) {
+ out.writeUTF("true#"+System.currentTimeMillis());
+ }
+ else {
+ out.writeUTF("false");
+ }
+ }
+ else if (split[0].compareTo("sync") == 0) {
+ List tasks = db.getTugas(split[1]);
+ out.flush();
+ out.writeInt(serialize(tasks).length);
+ out.flush();
+ for (int i = 0; i < tasks.size(); i++) {
+ System.out.println(i);
+ System.out.println(tasks.get(i).getId() + tasks.get(i).getNama() + tasks.get(i).getDeadline().toString() + tasks.get(i).isStatus() + tasks.get(i).getLast_mod() + tasks.get(i).getKategori() + tasks.get(i).getAssignee() + tasks.get(i).getTag());
+ }
+ out.write(serialize(tasks),0,serialize(tasks).length);
+ System.out.print(serialize(tasks).length);
+ }
+ else if (split[0].compareTo("update") == 0) {
+ db.Update(Integer.parseInt(split[1]), Boolean.parseBoolean(split[2]), Long.parseLong(split[3], 10));
+ System.out.println("update");
+ }
+
+ server.close();
+ } catch (IOException e) {
+
+ }
+ }
+ }
+
+ public static void main(String[] args) {
+// DbOperation db = new DbOperation();
+// List tasks = db.getTugas("felixt");
+// for(int i = 0; i < tasks.size(); i++)
+// System.out.println(tasks.get(i).getId()+tasks.get(i).getNama()+tasks.get(i).getKategori()+tasks.get(i).getAssignee()+tasks.get(i).getTag());
+ db = new DbOperation();
+ try {
+ Thread t = new Server();
+ t.start();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Tubes5-Progin/build.xml b/Tubes5-Progin/build.xml
new file mode 100644
index 00000000..4a1d7f6a
--- /dev/null
+++ b/Tubes5-Progin/build.xml
@@ -0,0 +1,65 @@
+
+ Builds, tests, and runs the project Tubes5-Progin.
+
+
+
diff --git a/Tubes5-Progin/build/built-jar.properties b/Tubes5-Progin/build/built-jar.properties
new file mode 100644
index 00000000..52dec92e
--- /dev/null
+++ b/Tubes5-Progin/build/built-jar.properties
@@ -0,0 +1,4 @@
+#Mon, 20 May 2013 14:56:08 +0700
+
+
+C\:\\Users\\User\\Documents\\NetBeansProjects\\Tubes\ 5\\Tubes5-Progin=
diff --git a/Tubes5-Progin/build/classes/META-INF/services/org.jdesktop.application.Application b/Tubes5-Progin/build/classes/META-INF/services/org.jdesktop.application.Application
new file mode 100644
index 00000000..e944b982
--- /dev/null
+++ b/Tubes5-Progin/build/classes/META-INF/services/org.jdesktop.application.Application
@@ -0,0 +1 @@
+tubes5progin.Tubes5ProginApp
\ No newline at end of file
diff --git a/Tubes5-Progin/build/classes/client/Client.class b/Tubes5-Progin/build/classes/client/Client.class
new file mode 100644
index 00000000..7095c633
Binary files /dev/null and b/Tubes5-Progin/build/classes/client/Client.class differ
diff --git a/Tubes5-Progin/build/classes/model/Tugas.class b/Tubes5-Progin/build/classes/model/Tugas.class
new file mode 100644
index 00000000..32330259
Binary files /dev/null and b/Tubes5-Progin/build/classes/model/Tugas.class differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/TableCellListener.class b/Tubes5-Progin/build/classes/tubes5progin/TableCellListener.class
new file mode 100644
index 00000000..c71276de
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/TableCellListener.class differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/TableCellLongTextRenderer.class b/Tubes5-Progin/build/classes/tubes5progin/TableCellLongTextRenderer.class
new file mode 100644
index 00000000..1a4db0ca
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/TableCellLongTextRenderer.class differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginAboutBox.class b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginAboutBox.class
new file mode 100644
index 00000000..7d029c15
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginAboutBox.class differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginApp.class b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginApp.class
new file mode 100644
index 00000000..8ddb3133
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginApp.class differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$1.class b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$1.class
new file mode 100644
index 00000000..d6add8b3
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$1.class differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$2.class b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$2.class
new file mode 100644
index 00000000..3fe71922
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$2.class differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$3.class b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$3.class
new file mode 100644
index 00000000..6445a8ba
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$3.class differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$4.class b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$4.class
new file mode 100644
index 00000000..4caafdc2
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$4.class differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$5.class b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$5.class
new file mode 100644
index 00000000..7c9052f0
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$5.class differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$6.class b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$6.class
new file mode 100644
index 00000000..e02551f0
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$6.class differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$7.class b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$7.class
new file mode 100644
index 00000000..d5bb23b8
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$7.class differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$8.class b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$8.class
new file mode 100644
index 00000000..d0f44b82
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$8.class differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$9.class b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$9.class
new file mode 100644
index 00000000..65291b6a
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView$9.class differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView.class b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView.class
new file mode 100644
index 00000000..847c91d7
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/Tubes5ProginView.class differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/Alert.properties b/Tubes5-Progin/build/classes/tubes5progin/resources/Alert.properties
new file mode 100644
index 00000000..0f7bac8b
--- /dev/null
+++ b/Tubes5-Progin/build/classes/tubes5progin/resources/Alert.properties
@@ -0,0 +1,3 @@
+jLabel1.text=Username
+jLabel2.text=Password
+jButton1.text=Ok
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/HalamanUtama.properties b/Tubes5-Progin/build/classes/tubes5progin/resources/HalamanUtama.properties
new file mode 100644
index 00000000..448e8a38
--- /dev/null
+++ b/Tubes5-Progin/build/classes/tubes5progin/resources/HalamanUtama.properties
@@ -0,0 +1,16 @@
+# To change this template, choose Tools | Templates
+# and open the template in the editor.
+
+editMenu.text=Edit
+cutMenuItem.text=Cut
+helpMenu.text=Help
+deleteMenuItem.text=Delete
+pasteMenuItem.text=Paste
+copyMenuItem.text=Copy
+saveMenuItem.text=Save
+contentsMenuItem.text=Contents
+saveAsMenuItem.text=Save As ...
+aboutMenuItem.text=About
+fileMenu.text=File
+openMenuItem.text=Open
+exitMenuItem.text=Exit
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/Main.properties b/Tubes5-Progin/build/classes/tubes5progin/resources/Main.properties
new file mode 100644
index 00000000..2cdc95c0
--- /dev/null
+++ b/Tubes5-Progin/build/classes/tubes5progin/resources/Main.properties
@@ -0,0 +1,2 @@
+
+jTable1.columnModel.title0=Nama Tugas
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/Tubes5ProginAboutBox.properties b/Tubes5-Progin/build/classes/tubes5progin/resources/Tubes5ProginAboutBox.properties
new file mode 100644
index 00000000..b76ddd5f
--- /dev/null
+++ b/Tubes5-Progin/build/classes/tubes5progin/resources/Tubes5ProginAboutBox.properties
@@ -0,0 +1,14 @@
+title = About: ${Application.title} ${Application.version}
+
+closeAboutBox.Action.text = &Close
+
+appDescLabel.text=${Application.description}
+
+versionLabel.text=Product Version\:
+
+vendorLabel.text=Vendor\:
+
+homepageLabel.text=Homepage\:
+
+#NOI18N
+imageLabel.icon=about.png
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/Tubes5ProginApp.properties b/Tubes5-Progin/build/classes/tubes5progin/resources/Tubes5ProginApp.properties
new file mode 100644
index 00000000..7af8304a
--- /dev/null
+++ b/Tubes5-Progin/build/classes/tubes5progin/resources/Tubes5ProginApp.properties
@@ -0,0 +1,11 @@
+# Application global resources
+
+Application.name = Tubes5-Progin
+Application.title = Basic Application Example
+Application.version = 1.0
+Application.vendor = Sun Microsystems Inc.
+Application.homepage = http\://appframework.dev.java.net/
+Application.description = A simple Java desktop application based on Swing Application Framework.
+Application.vendorId = Sun
+Application.id = ${Application.name}
+Application.lookAndFeel = system
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/Tubes5ProginView.properties b/Tubes5-Progin/build/classes/tubes5progin/resources/Tubes5ProginView.properties
new file mode 100644
index 00000000..dbf03362
--- /dev/null
+++ b/Tubes5-Progin/build/classes/tubes5progin/resources/Tubes5ProginView.properties
@@ -0,0 +1,53 @@
+
+# @Action resources
+
+showAboutBox.Action.text = &About...
+showAboutBox.Action.shortDescription = Show the application's information dialog
+
+# status bar resources
+
+StatusBar.messageTimeout = 5000
+StatusBar.busyAnimationRate = 30
+StatusBar.idleIcon = busyicons/idle-icon.png
+StatusBar.busyIcons[0] = busyicons/busy-icon0.png
+StatusBar.busyIcons[1] = busyicons/busy-icon1.png
+StatusBar.busyIcons[2] = busyicons/busy-icon2.png
+StatusBar.busyIcons[3] = busyicons/busy-icon3.png
+StatusBar.busyIcons[4] = busyicons/busy-icon4.png
+StatusBar.busyIcons[5] = busyicons/busy-icon5.png
+StatusBar.busyIcons[6] = busyicons/busy-icon6.png
+StatusBar.busyIcons[7] = busyicons/busy-icon7.png
+StatusBar.busyIcons[8] = busyicons/busy-icon8.png
+StatusBar.busyIcons[9] = busyicons/busy-icon9.png
+StatusBar.busyIcons[10] = busyicons/busy-icon10.png
+StatusBar.busyIcons[11] = busyicons/busy-icon11.png
+StatusBar.busyIcons[12] = busyicons/busy-icon12.png
+StatusBar.busyIcons[13] = busyicons/busy-icon13.png
+StatusBar.busyIcons[14] = busyicons/busy-icon14.png
+OnClickOk.Action.text=aaaa
+OnClickOk.Action.shortDescription=
+jLabel1.text=Password
+jTextField1.text=
+jLabel2.text=Username
+jLabel3.text=jLabel3
+jTable1.columnModel.title0=Title 1
+jTable1.columnModel.title3=Title 4
+jTable1.columnModel.title2=Title 3
+jTable1.columnModel.title1=Title 2
+jButton2.text=jButton2
+#NOI18N
+mainPanel.background=0, 204, 51
+#NOI18N
+mainPanel.foreground=0, 0, 0
+helpMenu.text=Help
+# Resources for the Tubes5ProginView class
+
+# top-level menus
+fileMenu.text=File
+jButton3.text=Logout
+jMenuItem1.text=Logout
+jButton1.text=OK
+#NOI18N
+jTable1.background=153, 255, 153
+#NOI18N
+jTable1.gridColor=204, 204, 204
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/about.png b/Tubes5-Progin/build/classes/tubes5progin/resources/about.png
new file mode 100644
index 00000000..c6dfe0a5
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/resources/about.png differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon0.png b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon0.png
new file mode 100644
index 00000000..242c0c85
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon0.png differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon1.png b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon1.png
new file mode 100644
index 00000000..9f6f6343
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon1.png differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon10.png b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon10.png
new file mode 100644
index 00000000..c4ef4a1f
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon10.png differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon11.png b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon11.png
new file mode 100644
index 00000000..6eca1f5e
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon11.png differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon12.png b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon12.png
new file mode 100644
index 00000000..e447ee8a
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon12.png differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon13.png b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon13.png
new file mode 100644
index 00000000..848a6f1a
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon13.png differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon14.png b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon14.png
new file mode 100644
index 00000000..7b3561df
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon14.png differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon2.png b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon2.png
new file mode 100644
index 00000000..c866e62a
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon2.png differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon3.png b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon3.png
new file mode 100644
index 00000000..9be22fa5
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon3.png differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon4.png b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon4.png
new file mode 100644
index 00000000..f07c20dc
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon4.png differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon5.png b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon5.png
new file mode 100644
index 00000000..653fc9c3
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon5.png differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon6.png b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon6.png
new file mode 100644
index 00000000..70355726
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon6.png differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon7.png b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon7.png
new file mode 100644
index 00000000..49fbc6ec
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon7.png differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon8.png b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon8.png
new file mode 100644
index 00000000..e1a5a409
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon8.png differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon9.png b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon9.png
new file mode 100644
index 00000000..82780123
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/busy-icon9.png differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/idle-icon.png b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/idle-icon.png
new file mode 100644
index 00000000..50312f85
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/resources/busyicons/idle-icon.png differ
diff --git a/Tubes5-Progin/build/classes/tubes5progin/resources/splash.png b/Tubes5-Progin/build/classes/tubes5progin/resources/splash.png
new file mode 100644
index 00000000..a1fbdc10
Binary files /dev/null and b/Tubes5-Progin/build/classes/tubes5progin/resources/splash.png differ
diff --git a/Tubes5-Progin/dist/README.TXT b/Tubes5-Progin/dist/README.TXT
new file mode 100644
index 00000000..65b6f332
--- /dev/null
+++ b/Tubes5-Progin/dist/README.TXT
@@ -0,0 +1,32 @@
+========================
+BUILD OUTPUT DESCRIPTION
+========================
+
+When you build an Java application project that has a main class, the IDE
+automatically copies all of the JAR
+files on the projects classpath to your projects dist/lib folder. The IDE
+also adds each of the JAR files to the Class-Path element in the application
+JAR files manifest file (MANIFEST.MF).
+
+To run the project from the command line, go to the dist folder and
+type the following:
+
+java -jar "Tubes5-Progin.jar"
+
+To distribute this project, zip up the dist folder (including the lib folder)
+and distribute the ZIP file.
+
+Notes:
+
+* If two JAR files on the project classpath have the same name, only the first
+JAR file is copied to the lib folder.
+* Only JAR files are copied to the lib folder.
+If the classpath contains other types of files or folders, these files (folders)
+are not copied.
+* If a library on the projects classpath also has a Class-Path element
+specified in the manifest,the content of the Class-Path element has to be on
+the projects runtime path.
+* To set a main class in a standard Java project, right-click the project node
+in the Projects window and choose Properties. Then click Run and enter the
+class name in the Main Class field. Alternatively, you can manually type the
+class name in the manifest Main-Class element.
diff --git a/Tubes5-Progin/dist/Tubes5-Progin.jar b/Tubes5-Progin/dist/Tubes5-Progin.jar
new file mode 100644
index 00000000..9be08248
Binary files /dev/null and b/Tubes5-Progin/dist/Tubes5-Progin.jar differ
diff --git a/Tubes5-Progin/dist/lib/appframework-1.0.3.jar b/Tubes5-Progin/dist/lib/appframework-1.0.3.jar
new file mode 100644
index 00000000..9f5cdbf7
Binary files /dev/null and b/Tubes5-Progin/dist/lib/appframework-1.0.3.jar differ
diff --git a/Tubes5-Progin/dist/lib/swing-worker-1.1.jar b/Tubes5-Progin/dist/lib/swing-worker-1.1.jar
new file mode 100644
index 00000000..02f23a3a
Binary files /dev/null and b/Tubes5-Progin/dist/lib/swing-worker-1.1.jar differ
diff --git a/Tubes5-Progin/manifest.mf b/Tubes5-Progin/manifest.mf
new file mode 100644
index 00000000..328e8e5b
--- /dev/null
+++ b/Tubes5-Progin/manifest.mf
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+X-COMMENT: Main-Class will be added automatically by build
+
diff --git a/Tubes5-Progin/nbproject/build-impl.xml b/Tubes5-Progin/nbproject/build-impl.xml
new file mode 100644
index 00000000..a926f523
--- /dev/null
+++ b/Tubes5-Progin/nbproject/build-impl.xml
@@ -0,0 +1,1040 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must set src.dir
+ Must set test.src.dir
+ Must set build.dir
+ Must set dist.dir
+ Must set build.classes.dir
+ Must set dist.javadoc.dir
+ Must set build.test.classes.dir
+ Must set build.test.results.dir
+ Must set build.classes.excludes
+ Must set dist.jar
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must set javac.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must set JVM to use for profiling in profiler.info.jvm
+ Must set profiler agent JVM arguments in profiler.info.jvmargs.agent
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select some files in the IDE or set javac.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ To run this application from the command line without Ant, try:
+
+
+
+
+
+
+ java -cp "${run.classpath.with.dist.jar}" ${main.class}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ To run this application from the command line without Ant, try:
+
+ java -jar "${dist.jar.resolved}"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set debug.class
+
+
+
+
+ Must select one file in the IDE or set debug.class
+
+
+
+
+ Must set fix.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set profile.class
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select some files in the IDE or set javac.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Some tests failed; see details above.
+
+
+
+
+
+
+
+
+ Must select some files in the IDE or set test.includes
+
+
+
+ Some tests failed; see details above.
+
+
+
+
+ Must select one file in the IDE or set test.class
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set applet.url
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set applet.url
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Tubes5-Progin/nbproject/genfiles.properties b/Tubes5-Progin/nbproject/genfiles.properties
new file mode 100644
index 00000000..99c7adea
--- /dev/null
+++ b/Tubes5-Progin/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=519dac0f
+build.xml.script.CRC32=4337d1b4
+build.xml.stylesheet.CRC32=28e38971@1.44.1.45
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=519dac0f
+nbproject/build-impl.xml.script.CRC32=9616c303
+nbproject/build-impl.xml.stylesheet.CRC32=0ae3a408@1.44.1.45
diff --git a/Tubes5-Progin/nbproject/private/private.properties b/Tubes5-Progin/nbproject/private/private.properties
new file mode 100644
index 00000000..0ffccac7
--- /dev/null
+++ b/Tubes5-Progin/nbproject/private/private.properties
@@ -0,0 +1,3 @@
+#Fri May 17 07:50:02 ICT 2013
+compile.on.save=true
+user.properties.file=C:\\Users\\User\\.netbeans\\7.0\\build.properties
diff --git a/Tubes5-Progin/nbproject/private/private.xml b/Tubes5-Progin/nbproject/private/private.xml
new file mode 100644
index 00000000..c1f155a7
--- /dev/null
+++ b/Tubes5-Progin/nbproject/private/private.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/Tubes5-Progin/nbproject/project.properties b/Tubes5-Progin/nbproject/project.properties
new file mode 100644
index 00000000..96aae4a5
--- /dev/null
+++ b/Tubes5-Progin/nbproject/project.properties
@@ -0,0 +1,63 @@
+application.desc=A simple java desktop application based on Swing Application Framework
+application.homepage=http://appframework.dev.java.net
+application.title=Basic Application Example
+application.vendor=Sun Microsystems Inc.
+build.classes.dir=${build.dir}/classes
+build.classes.excludes=**/*.java,**/*.form
+# This directory is removed when the project is cleaned:
+build.dir=build
+build.generated.dir=${build.dir}/generated
+build.generated.sources.dir=${build.dir}/generated-sources
+# Only compile against the classpath explicitly listed here:
+build.sysclasspath=ignore
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+debug.classpath=\
+ ${run.classpath}
+debug.test.classpath=\
+ ${run.test.classpath}
+# This directory is removed when the project is cleaned:
+dist.dir=dist
+dist.jar=${dist.dir}/Tubes5-Progin.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+excludes=
+includes=**
+jar.compress=false
+javac.classpath=\
+ ${libs.swing-app-framework.classpath}
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.deprecation=false
+javac.source=1.5
+javac.target=1.5
+javac.test.classpath=\
+ ${javac.classpath}:\
+ ${build.classes.dir}
+javadoc.additionalparam=
+javadoc.author=false
+javadoc.encoding=${source.encoding}
+javadoc.noindex=false
+javadoc.nonavbar=false
+javadoc.notree=false
+javadoc.private=false
+javadoc.splitindex=true
+javadoc.use=true
+javadoc.version=false
+javadoc.windowtitle=
+main.class=tubes5progin.Tubes5ProginApp
+manifest.file=manifest.mf
+meta.inf.dir=${src.dir}/META-INF
+platform.active=default_platform
+run.classpath=\
+ ${javac.classpath}:\
+ ${build.classes.dir}
+# Space-separated list of JVM arguments used when running the project
+# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
+# or test-sys-prop.name=value to set system properties for unit tests):
+run.jvmargs=
+run.test.classpath=\
+ ${javac.test.classpath}:\
+ ${build.test.classes.dir}
+source.encoding=UTF-8
+src.dir=src
+test.src.dir=test
diff --git a/Tubes5-Progin/nbproject/project.xml b/Tubes5-Progin/nbproject/project.xml
new file mode 100644
index 00000000..4969645d
--- /dev/null
+++ b/Tubes5-Progin/nbproject/project.xml
@@ -0,0 +1,19 @@
+
+
+ org.netbeans.modules.java.j2seproject
+
+
+ Tubes5-Progin
+ 1.6.5
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Tubes5-Progin/src/META-INF/services/org.jdesktop.application.Application b/Tubes5-Progin/src/META-INF/services/org.jdesktop.application.Application
new file mode 100644
index 00000000..e944b982
--- /dev/null
+++ b/Tubes5-Progin/src/META-INF/services/org.jdesktop.application.Application
@@ -0,0 +1 @@
+tubes5progin.Tubes5ProginApp
\ No newline at end of file
diff --git a/Tubes5-Progin/src/client/Client.java b/Tubes5-Progin/src/client/Client.java
new file mode 100644
index 00000000..8bb4e7f2
--- /dev/null
+++ b/Tubes5-Progin/src/client/Client.java
@@ -0,0 +1,362 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package client;
+
+import java.io.*;
+import java.net.Socket;
+import java.net.UnknownHostException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import model.Tugas;
+
+public class Client {
+
+ private String serverName = "localhost";
+ private int port = 6066;
+ private String username;
+ private boolean login = false;
+ private long deltaTime;
+ private static int command = 0;
+ private List tasks;
+ private boolean prevState = false;
+ private boolean State = false;
+
+ public Client() {
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public byte[] serialize(Object obj) throws IOException {
+ ByteArrayOutputStream b = new ByteArrayOutputStream();
+ ObjectOutputStream o = new ObjectOutputStream(b);
+ o.writeObject(obj);
+ return b.toByteArray();
+ }
+
+ public Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
+ ByteArrayInputStream b = new ByteArrayInputStream(bytes);
+ ObjectInputStream o = new ObjectInputStream(b);
+ return o.readObject();
+ }
+
+ /**
+ * @return the serverName
+ */
+ public String getServerName() {
+ return serverName;
+ }
+
+ /**
+ * @param serverName the serverName to set
+ */
+ public void setServerName(String serverName) {
+ this.serverName = serverName;
+ }
+
+ /**
+ * @param port the port to set
+ */
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ /**
+ * @return the username
+ */
+ public String getUsername() {
+ return username;
+ }
+
+ /**
+ * @param username the username to set
+ */
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ /**
+ * @return the isLogin
+ */
+ public boolean isLogin() {
+ return login;
+ }
+
+ /**
+ * @param isLogin the isLogin to set
+ */
+ public void setLogin(boolean login) {
+ this.login = login;
+ }
+
+ /**
+ * @return the deltaTime
+ */
+ public long getDeltaTime() {
+ return deltaTime;
+ }
+
+ /**
+ * @param deltaTime the deltaTime to set
+ */
+ public void setDeltaTime(long deltaTime) {
+ this.deltaTime = deltaTime;
+ }
+
+ /**
+ * @return the command
+ */
+ public int getCommand() {
+ return command;
+ }
+
+ /**
+ * @param command the command to set
+ */
+ public void setCommand(int command) {
+ this.command = command;
+ }
+
+ public void checkOnline() {
+ prevState = State;
+ try {
+ System.out.println("Connecting to " + getServerName() + " on port " + getPort());
+ Socket socket;
+ socket = new Socket(getServerName(), getPort());
+ System.out.println("Just connected to " + socket.getRemoteSocketAddress());
+ socket.close();
+ State = true;
+ } catch (IOException ex) {
+ State = false;
+ }
+
+ }
+
+ public void Login(String user, String pass) {
+ try {
+ System.out.println(user + " " + pass);
+ System.out.println("Connecting to " + getServerName() + " on port " + getPort());
+ Socket socket = new Socket(getServerName(), getPort());
+ System.out.println("Just connected to " + socket.getRemoteSocketAddress());
+
+ OutputStream outToServer = socket.getOutputStream();
+ DataOutputStream out = new DataOutputStream(outToServer);
+
+ out.writeUTF("login#" + user + "#" + pass);
+
+ InputStream inFromServer = socket.getInputStream();
+ DataInputStream in = new DataInputStream(inFromServer);
+ String response = in.readUTF();
+ System.out.println(response);
+ String split[] = response.split("#");
+ if (Boolean.parseBoolean(split[0])) {
+ setDeltaTime(Long.parseLong(split[1], 10) - System.currentTimeMillis());
+ setUsername(user);
+ setLogin(true);
+ }
+ socket.close();
+ State = true;
+ } catch (IOException ex) {
+ }
+ }
+
+ public void update(int id, boolean stats) {
+ String request = "update#" + id + "#" + stats + "#" + (System.currentTimeMillis() + getDeltaTime());
+ try {
+ BufferedWriter out = new BufferedWriter(new FileWriter(getUsername() + "_log.txt", true));
+ out.write(request + "\n");
+ out.close();
+ } catch (IOException ex1) {
+ }
+ try {
+ System.out.println("Connecting to " + getServerName() + " on port " + getPort());
+ Socket socket = new Socket(getServerName(), getPort());
+ socket.setSoTimeout(10000);
+ System.out.println("Just connected to " + socket.getRemoteSocketAddress());
+
+ OutputStream outToServer = socket.getOutputStream();
+ DataOutputStream out = new DataOutputStream(outToServer);
+
+ out.writeUTF(request);
+
+ socket.close();
+ } catch (IOException ex) {
+ }
+ }
+
+ public void sync() {
+ if (!isPrevState() && isState()) {
+ try {
+ HashMap logging = new HashMap();
+ BufferedReader br = new BufferedReader(new FileReader(getUsername() + "_log.txt"));
+ String line = br.readLine();
+ while (!(line == null)) {
+ String split[] = line.split("#");
+ logging.put(Integer.parseInt(split[1]), line);
+ line = br.readLine();
+ }
+ br.close();
+ Iterator it = logging.entrySet().iterator();
+ while (it.hasNext()) {
+ Map.Entry pairs = (Map.Entry) it.next();
+ try {
+ Socket socket = new Socket(getServerName(), getPort());
+ socket.setSoTimeout(10000);
+
+ OutputStream outToServer = socket.getOutputStream();
+ DataOutputStream out = new DataOutputStream(outToServer);
+
+ out.writeUTF(pairs.getValue().toString());
+
+ socket.close();
+
+ } catch (IOException ex) {
+ }
+ it.remove();
+ }
+
+ } catch (IOException ex) {
+ }
+ }
+
+ if (State) {
+ try {
+ System.out.println("Connecting to " + getServerName() + " on port " + getPort());
+ Socket socket = new Socket(getServerName(), getPort());
+ socket.setSoTimeout(10000);
+ System.out.println("Just connected to " + socket.getRemoteSocketAddress());
+
+ OutputStream outToServer = socket.getOutputStream();
+ DataOutputStream out = new DataOutputStream(outToServer);
+
+ out.writeUTF("sync#" + getUsername());
+ InputStream inFromServer = socket.getInputStream();
+ DataInputStream in = new DataInputStream(inFromServer);
+
+ int len = in.readInt();
+ System.out.println("len :" + len);
+ byte[] data = new byte[len];
+ if (len > 0) {
+ in.readFully(data, 0, len);
+ }
+ setTasks((List) deserialize(data));
+ for (int i = 0; i < getTasks().size(); i++) {
+ System.out.println(i);
+ System.out.println(getTasks().get(i).getId() + getTasks().get(i).getNama() + getTasks().get(i).getDeadline().toString() + getTasks().get(i).isStatus() + getTasks().get(i).getLast_mod() + getTasks().get(i).getKategori() + getTasks().get(i).getAssignee() + getTasks().get(i).getTag());
+ }
+ socket.close();
+ setPrevState(isState());
+ setState(true);
+ } catch (ClassNotFoundException ex) {
+ } catch (IOException ex) {
+ setPrevState(isState());
+ setState(false);
+ }
+ }
+ }
+
+ public void logout() {
+ setLogin(false);
+ setUsername("");
+ }
+
+// @Override
+// public void run() {
+// while (true) {
+//
+// if (!isLogin()) {
+// System.out.print("command : ");
+// BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
+// try {
+// command = Integer.parseInt(br1.readLine());
+// } catch (IOException ex) {
+//
+// }
+// if (getCommand() == 0) {
+// Login("wilson", "12345678");
+//
+// sync();
+// }
+// } else {
+// try {
+// System.out.print("command : ");
+// BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+// command = Integer.parseInt(br.readLine());
+// System.out.println(command);
+// switch (getCommand()) {
+// case 1:
+// System.out.print("id : ");
+// BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));
+// int idt = Integer.parseInt(br2.readLine());
+// update(idt, true);//update
+// break;
+// case 2:
+// sync(); //synchronization
+// break;
+// case 3:
+// logout();
+// break;
+// default : break;
+// }
+// setCommand(-1);
+// } catch (IOException ex) {
+//
+// }
+// }
+// }
+// }
+//
+// public static void main(String[] args) throws IOException
+// {
+// Thread t = new Client();
+// t.start();
+// }
+ /**
+ * @return the tasks
+ */
+ public List getTasks() {
+ return tasks;
+ }
+
+ /**
+ * @param tasks the tasks to set
+ */
+ public void setTasks(List tasks) {
+ this.tasks = tasks;
+ }
+
+ /**
+ * @return the prevState
+ */
+ public boolean isPrevState() {
+ return prevState;
+ }
+
+ /**
+ * @param prevState the prevState to set
+ */
+ public void setPrevState(boolean prevState) {
+ this.prevState = prevState;
+ }
+
+ /**
+ * @return the State
+ */
+ public boolean isState() {
+ return State;
+ }
+
+ /**
+ * @param State the State to set
+ */
+ public void setState(boolean State) {
+ this.State = State;
+ }
+}
\ No newline at end of file
diff --git a/Tubes5-Progin/src/model/Tugas.java b/Tubes5-Progin/src/model/Tugas.java
new file mode 100644
index 00000000..bdec45e0
--- /dev/null
+++ b/Tubes5-Progin/src/model/Tugas.java
@@ -0,0 +1,134 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package model;
+
+import java.util.Date;
+
+/**
+ *
+ * @author TOSHIBA
+ */
+public class Tugas implements java.io.Serializable {
+ private int id;
+ private String nama;
+ private Date deadline;
+ private String kategori;
+ private String assignee;
+ private String tag;
+ private boolean status;
+ private long last_mod;
+
+ /**
+ * @return the id
+ */
+ public int getId() {
+ return id;
+ }
+
+ /**
+ * @param id the id to set
+ */
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ /**
+ * @return the nama
+ */
+ public String getNama() {
+ return nama;
+ }
+
+ /**
+ * @param nama the nama to set
+ */
+ public void setNama(String nama) {
+ this.nama = nama;
+ }
+
+ /**
+ * @return the deadline
+ */
+ public Date getDeadline() {
+ return deadline;
+ }
+
+ /**
+ * @param deadline the deadline to set
+ */
+ public void setDeadline(Date deadline) {
+ this.deadline = deadline;
+ }
+
+ /**
+ * @return the kategori
+ */
+ public String getKategori() {
+ return kategori;
+ }
+
+ /**
+ * @param kategori the kategori to set
+ */
+ public void setKategori(String kategori) {
+ this.kategori = kategori;
+ }
+
+ /**
+ * @return the assignee
+ */
+ public String getAssignee() {
+ return assignee;
+ }
+
+ /**
+ * @param assignee the assignee to set
+ */
+ public void setAssignee(String assignee) {
+ this.assignee = assignee;
+ }
+
+ /**
+ * @return the tag
+ */
+ public String getTag() {
+ return tag;
+ }
+
+ /**
+ * @param tag the tag to set
+ */
+ public void setTag(String tag) {
+ this.tag = tag;
+ }
+
+ /**
+ * @return the status
+ */
+ public boolean isStatus() {
+ return status;
+ }
+
+ /**
+ * @param status the status to set
+ */
+ public void setStatus(boolean status) {
+ this.status = status;
+ }
+
+ /**
+ * @return the last_mod
+ */
+ public long getLast_mod() {
+ return last_mod;
+ }
+
+ /**
+ * @param last_mod the last_mod to set
+ */
+ public void setLast_mod(long last_mod) {
+ this.last_mod = last_mod;
+ }
+}
diff --git a/Tubes5-Progin/src/tubes5progin/TableCellListener.java b/Tubes5-Progin/src/tubes5progin/TableCellListener.java
new file mode 100644
index 00000000..9a759135
--- /dev/null
+++ b/Tubes5-Progin/src/tubes5progin/TableCellListener.java
@@ -0,0 +1,173 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package tubes5progin;
+import java.awt.event.*;
+import javax.swing.*;
+import java.beans.*;
+
+/*
+ * This class listens for changes made to the data in the table via the
+ * TableCellEditor. When editing is started, the value of the cell is saved
+ * When editing is stopped the new value is saved. When the oold and new
+ * values are different, then the provided Action is invoked.
+ *
+ * The source of the Action is a TableCellListener instance.
+ */
+public class TableCellListener implements PropertyChangeListener, Runnable
+{
+ private JTable table;
+ private Action action;
+
+ private int row;
+ private int column;
+ private Object oldValue;
+ private Object newValue;
+
+ /**
+ * Create a TableCellListener.
+ *
+ * @param table the table to be monitored for data changes
+ * @param action the Action to invoke when cell data is changed
+ */
+ public TableCellListener(JTable table, Action action)
+ {
+ this.table = table;
+ this.action = action;
+ this.table.addPropertyChangeListener( this );
+ }
+
+ /**
+ * Create a TableCellListener with a copy of all the data relevant to
+ * the change of data for a given cell.
+ *
+ * @param row the row of the changed cell
+ * @param column the column of the changed cell
+ * @param oldValue the old data of the changed cell
+ * @param newValue the new data of the changed cell
+ */
+ private TableCellListener(JTable table, int row, int column, Object oldValue, Object newValue)
+ {
+ this.table = table;
+ this.row = row;
+ this.column = column;
+ this.oldValue = oldValue;
+ this.newValue = newValue;
+ }
+
+ /**
+ * Get the column that was last edited
+ *
+ * @return the column that was edited
+ */
+ public int getColumn()
+ {
+ return column;
+ }
+
+ /**
+ * Get the new value in the cell
+ *
+ * @return the new value in the cell
+ */
+ public Object getNewValue()
+ {
+ return newValue;
+ }
+
+ /**
+ * Get the old value of the cell
+ *
+ * @return the old value of the cell
+ */
+ public Object getOldValue()
+ {
+ return oldValue;
+ }
+
+ /**
+ * Get the row that was last edited
+ *
+ * @return the row that was edited
+ */
+ public int getRow()
+ {
+ return row;
+ }
+
+ /**
+ * Get the table of the cell that was changed
+ *
+ * @return the table of the cell that was changed
+ */
+ public JTable getTable()
+ {
+ return table;
+ }
+//
+// Implement the PropertyChangeListener interface
+//
+ @Override
+ public void propertyChange(PropertyChangeEvent e)
+ {
+ // A cell has started/stopped editing
+
+ if ("tableCellEditor".equals(e.getPropertyName()))
+ {
+ if (table.isEditing())
+ processEditingStarted();
+ else
+ processEditingStopped();
+ }
+ }
+
+ /*
+ * Save information of the cell about to be edited
+ */
+ private void processEditingStarted()
+ {
+ // The invokeLater is necessary because the editing row and editing
+ // column of the table have not been set when the "tableCellEditor"
+ // PropertyChangeEvent is fired.
+ // This results in the "run" method being invoked
+
+ SwingUtilities.invokeLater( this );
+ }
+ /*
+ * See above.
+ */
+ @Override
+ public void run()
+ {
+ row = table.convertRowIndexToModel( table.getEditingRow() );
+ column = table.convertColumnIndexToModel( table.getEditingColumn() );
+ oldValue = table.getModel().getValueAt(row, column);
+ newValue = null;
+ }
+
+ /*
+ * Update the Cell history when necessary
+ */
+ private void processEditingStopped()
+ {
+ newValue = table.getModel().getValueAt(row, column);
+
+ // The data has changed, invoke the supplied Action
+
+ if (! newValue.equals(oldValue))
+ {
+ // Make a copy of the data in case another cell starts editing
+ // while processing this change
+
+ TableCellListener tcl = new TableCellListener(
+ getTable(), getRow(), getColumn(), getOldValue(), getNewValue());
+
+ ActionEvent event = new ActionEvent(
+ tcl,
+ ActionEvent.ACTION_PERFORMED,
+ "");
+ action.actionPerformed(event);
+ }
+ }
+}
diff --git a/Tubes5-Progin/src/tubes5progin/TableCellLongTextRenderer.java b/Tubes5-Progin/src/tubes5progin/TableCellLongTextRenderer.java
new file mode 100644
index 00000000..9c0ef09b
--- /dev/null
+++ b/Tubes5-Progin/src/tubes5progin/TableCellLongTextRenderer.java
@@ -0,0 +1,37 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package tubes5progin;
+
+import java.awt.Component;
+import javax.swing.JTable;
+import javax.swing.JTextArea;
+import javax.swing.UIManager;
+import javax.swing.border.EmptyBorder;
+import javax.swing.table.TableCellRenderer;
+
+/**
+ *
+ * @author Yulianti Oenang
+ */
+public class TableCellLongTextRenderer extends JTextArea implements TableCellRenderer{
+
+@Override
+public Component getTableCellRendererComponent(JTable table, Object value,
+boolean isSelected, boolean hasFocus, int row, int column) {
+
+ this.setText((String)value);
+ this.setWrapStyleWord(true);
+ this.setLineWrap(true);
+
+ //set the JTextArea to the width of the table column
+ setSize(table.getColumnModel().getColumn(column).getWidth(),getPreferredSize().height);
+
+ if (table.getRowHeight(row) < getPreferredSize().height) {
+ //set the height of the table row to the calculated height of the JTextArea
+ table.setRowHeight(row, getPreferredSize().height);
+ }
+
+ return this;
+}}
\ No newline at end of file
diff --git a/Tubes5-Progin/src/tubes5progin/Tubes5ProginAboutBox.form b/Tubes5-Progin/src/tubes5progin/Tubes5ProginAboutBox.form
new file mode 100644
index 00000000..5075217f
--- /dev/null
+++ b/Tubes5-Progin/src/tubes5progin/Tubes5ProginAboutBox.form
@@ -0,0 +1,204 @@
+
+
+
diff --git a/Tubes5-Progin/src/tubes5progin/Tubes5ProginAboutBox.java b/Tubes5-Progin/src/tubes5progin/Tubes5ProginAboutBox.java
new file mode 100644
index 00000000..165ba943
--- /dev/null
+++ b/Tubes5-Progin/src/tubes5progin/Tubes5ProginAboutBox.java
@@ -0,0 +1,137 @@
+/*
+ * Tubes5ProginAboutBox.java
+ */
+
+package tubes5progin;
+
+import org.jdesktop.application.Action;
+
+public class Tubes5ProginAboutBox extends javax.swing.JDialog {
+
+ public Tubes5ProginAboutBox(java.awt.Frame parent) {
+ super(parent);
+ initComponents();
+ getRootPane().setDefaultButton(closeButton);
+ }
+
+ @Action public void closeAboutBox() {
+ dispose();
+ }
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ closeButton = new javax.swing.JButton();
+ javax.swing.JLabel appTitleLabel = new javax.swing.JLabel();
+ javax.swing.JLabel versionLabel = new javax.swing.JLabel();
+ javax.swing.JLabel appVersionLabel = new javax.swing.JLabel();
+ javax.swing.JLabel vendorLabel = new javax.swing.JLabel();
+ javax.swing.JLabel appVendorLabel = new javax.swing.JLabel();
+ javax.swing.JLabel homepageLabel = new javax.swing.JLabel();
+ javax.swing.JLabel appHomepageLabel = new javax.swing.JLabel();
+ javax.swing.JLabel appDescLabel = new javax.swing.JLabel();
+ javax.swing.JLabel imageLabel = new javax.swing.JLabel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+ org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(tubes5progin.Tubes5ProginApp.class).getContext().getResourceMap(Tubes5ProginAboutBox.class);
+ setTitle(resourceMap.getString("title")); // NOI18N
+ setModal(true);
+ setName("aboutBox"); // NOI18N
+ setResizable(false);
+
+ javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(tubes5progin.Tubes5ProginApp.class).getContext().getActionMap(Tubes5ProginAboutBox.class, this);
+ closeButton.setAction(actionMap.get("closeAboutBox")); // NOI18N
+ closeButton.setName("closeButton"); // NOI18N
+
+ appTitleLabel.setFont(appTitleLabel.getFont().deriveFont(appTitleLabel.getFont().getStyle() | java.awt.Font.BOLD, appTitleLabel.getFont().getSize()+4));
+ appTitleLabel.setText(resourceMap.getString("Application.title")); // NOI18N
+ appTitleLabel.setName("appTitleLabel"); // NOI18N
+
+ versionLabel.setFont(versionLabel.getFont().deriveFont(versionLabel.getFont().getStyle() | java.awt.Font.BOLD));
+ versionLabel.setText(resourceMap.getString("versionLabel.text")); // NOI18N
+ versionLabel.setName("versionLabel"); // NOI18N
+
+ appVersionLabel.setText(resourceMap.getString("Application.version")); // NOI18N
+ appVersionLabel.setName("appVersionLabel"); // NOI18N
+
+ vendorLabel.setFont(vendorLabel.getFont().deriveFont(vendorLabel.getFont().getStyle() | java.awt.Font.BOLD));
+ vendorLabel.setText(resourceMap.getString("vendorLabel.text")); // NOI18N
+ vendorLabel.setName("vendorLabel"); // NOI18N
+
+ appVendorLabel.setText(resourceMap.getString("Application.vendor")); // NOI18N
+ appVendorLabel.setName("appVendorLabel"); // NOI18N
+
+ homepageLabel.setFont(homepageLabel.getFont().deriveFont(homepageLabel.getFont().getStyle() | java.awt.Font.BOLD));
+ homepageLabel.setText(resourceMap.getString("homepageLabel.text")); // NOI18N
+ homepageLabel.setName("homepageLabel"); // NOI18N
+
+ appHomepageLabel.setText(resourceMap.getString("Application.homepage")); // NOI18N
+ appHomepageLabel.setName("appHomepageLabel"); // NOI18N
+
+ appDescLabel.setText(resourceMap.getString("appDescLabel.text")); // NOI18N
+ appDescLabel.setName("appDescLabel"); // NOI18N
+
+ imageLabel.setIcon(resourceMap.getIcon("imageLabel.icon")); // NOI18N
+ imageLabel.setName("imageLabel"); // NOI18N
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
+ getContentPane().setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addComponent(imageLabel)
+ .addGap(18, 18, 18)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+ .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(versionLabel)
+ .addComponent(vendorLabel)
+ .addComponent(homepageLabel))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(appVersionLabel)
+ .addComponent(appVendorLabel)
+ .addComponent(appHomepageLabel)))
+ .addComponent(appTitleLabel, javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(appDescLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 266, Short.MAX_VALUE)
+ .addComponent(closeButton))
+ .addContainerGap())
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(imageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(appTitleLabel)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(appDescLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(versionLabel)
+ .addComponent(appVersionLabel))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(vendorLabel)
+ .addComponent(appVendorLabel))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(homepageLabel)
+ .addComponent(appHomepageLabel))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 19, Short.MAX_VALUE)
+ .addComponent(closeButton)
+ .addContainerGap())
+ );
+
+ pack();
+ }// //GEN-END:initComponents
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton closeButton;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/Tubes5-Progin/src/tubes5progin/Tubes5ProginApp.java b/Tubes5-Progin/src/tubes5progin/Tubes5ProginApp.java
new file mode 100644
index 00000000..055efde6
--- /dev/null
+++ b/Tubes5-Progin/src/tubes5progin/Tubes5ProginApp.java
@@ -0,0 +1,43 @@
+/*
+ * Tubes5ProginApp.java
+ */
+
+package tubes5progin;
+
+import org.jdesktop.application.Application;
+import org.jdesktop.application.SingleFrameApplication;
+
+/**
+ * The main class of the application.
+ */
+public class Tubes5ProginApp extends SingleFrameApplication {
+ /**
+ * At startup create and show the main frame of the application.
+ */
+ @Override protected void startup() {
+ show(new Tubes5ProginView(this));
+ }
+
+ /**
+ * This method is to initialize the specified window by injecting resources.
+ * Windows shown in our application come fully initialized from the GUI
+ * builder, so this additional configuration is not needed.
+ */
+ @Override protected void configureWindow(java.awt.Window root) {
+ }
+
+ /**
+ * A convenient static getter for the application instance.
+ * @return the instance of Tubes5ProginApp
+ */
+ public static Tubes5ProginApp getApplication() {
+ return Application.getInstance(Tubes5ProginApp.class);
+ }
+
+ /**
+ * Main method launching the application.
+ */
+ public static void main(String[] args) {
+ launch(Tubes5ProginApp.class, args);
+ }
+}
diff --git a/Tubes5-Progin/src/tubes5progin/Tubes5ProginView.form b/Tubes5-Progin/src/tubes5progin/Tubes5ProginView.form
new file mode 100644
index 00000000..24c86efb
--- /dev/null
+++ b/Tubes5-Progin/src/tubes5progin/Tubes5ProginView.form
@@ -0,0 +1,332 @@
+
+
+
diff --git a/Tubes5-Progin/src/tubes5progin/Tubes5ProginView.java b/Tubes5-Progin/src/tubes5progin/Tubes5ProginView.java
new file mode 100644
index 00000000..b21861ad
--- /dev/null
+++ b/Tubes5-Progin/src/tubes5progin/Tubes5ProginView.java
@@ -0,0 +1,512 @@
+/*
+ * Tubes5ProginView.java
+ */
+package tubes5progin;
+
+import model.Tugas;
+import client.Client;
+import org.jdesktop.application.Action;
+import org.jdesktop.application.ResourceMap;
+import org.jdesktop.application.SingleFrameApplication;
+import org.jdesktop.application.FrameView;
+import org.jdesktop.application.TaskMonitor;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.TimerTask;
+import javax.swing.Timer;
+import javax.swing.AbstractAction;
+import javax.swing.Icon;
+import javax.swing.JDialog;
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
+
+/**
+ * The application's main frame.
+ */
+public class Tubes5ProginView extends FrameView {
+
+ public List Task = new ArrayList();
+ Date tanggal = new Date();
+ Client client = new Client();
+ java.util.Timer timer = new java.util.Timer();
+
+ public Tubes5ProginView(SingleFrameApplication app) {
+ super(app);
+ initComponents();
+ timer.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ if(client.isLogin())
+ {
+ client.checkOnline();
+ if (client.isState()) {
+ sync();
+ System.out.println("Syncing...");
+ }
+ }
+ }
+ }, 2000, 2000);
+ //mainPanel.setPreferredSize(new java.awt.Dimension(800, 800));
+ mainPanel.setSize(800, 800);
+ jLabel3.setVisible(false);
+ Object data[][];
+ data = new Object[Task.size()][6];
+ for (int i = 0; i < Task.size(); i++) {
+ String tgl = Task.get(i).getDeadline().getDate() + "-" + (Task.get(i).getDeadline().getMonth() + 1) + "-" + Task.get(i).getDeadline().getYear();
+ data[i][0] = Task.get(i).getNama();
+ data[i][1] = Task.get(i).getDeadline();
+ data[i][2] = Task.get(i).getAssignee();
+ data[i][3] = Task.get(i).getTag();
+ data[i][4] = Task.get(i).isStatus();
+ data[i][5] = Task.get(i).getKategori();
+ }
+
+ jTable1.setModel(new javax.swing.table.DefaultTableModel(
+ data,
+ new Object[]{
+ "Nama Tugas", "Deadline", "Assignee", "Tag", "Status", "Kategori"
+ }) {
+
+ Class[] types = new Class[]{
+ java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Boolean.class, java.lang.Object.class
+ };
+ boolean[] canEdit = new boolean[]{
+ false, false, false, false, true, false
+ };
+
+ public Class getColumnClass(int columnIndex) {
+ return types[columnIndex];
+ }
+ });
+ jTable1.setVisible(false);
+ jTable1.getColumnModel().getColumn(0).setCellRenderer(new TableCellLongTextRenderer());
+ jTable1.getColumnModel().getColumn(1).setCellRenderer(new TableCellLongTextRenderer());
+ jTable1.getColumnModel().getColumn(2).setCellRenderer(new TableCellLongTextRenderer());
+ jTable1.getColumnModel().getColumn(3).setCellRenderer(new TableCellLongTextRenderer());
+ jTable1.getColumnModel().getColumn(5).setCellRenderer(new TableCellLongTextRenderer());
+
+ jTable1.getColumnModel().getColumn(0).setMinWidth(100);
+ jTable1.getColumnModel().getColumn(0).setMaxWidth(100);
+ jTable1.getColumnModel().getColumn(1).setMinWidth(80);
+ jTable1.getColumnModel().getColumn(1).setMaxWidth(80);
+ jTable1.getColumnModel().getColumn(2).setMinWidth(100);
+ jTable1.getColumnModel().getColumn(2).setMaxWidth(100);
+ jTable1.getColumnModel().getColumn(3).setMinWidth(100);
+ jTable1.getColumnModel().getColumn(3).setMaxWidth(100);
+ jTable1.getColumnModel().getColumn(3).setMinWidth(100);
+ jTable1.getColumnModel().getColumn(3).setMaxWidth(100);
+ jTable1.getColumnModel().getColumn(4).setMinWidth(50);
+ jTable1.getColumnModel().getColumn(4).setMaxWidth(50);
+ jTable1.getColumnModel().getColumn(5).setMinWidth(100);
+ jTable1.getColumnModel().getColumn(5).setMaxWidth(100);
+ jScrollPane1.setVisible(false);
+ jButton3.setText("Logout");
+ jButton3.setVisible(false);
+ AbstractAction action = new AbstractAction() {
+
+ public void actionPerformed(ActionEvent e) {
+ TableCellListener tcl = (TableCellListener) e.getSource();
+ System.out.println("Row : " + tcl.getRow());
+ System.out.println("Column: " + tcl.getColumn());
+ System.out.println("Old : " + tcl.getOldValue());
+ System.out.println("New : " + tcl.getNewValue());
+ System.out.println(Task.get(tcl.getRow()).getId());
+ client.update(Task.get(tcl.getRow()).getId(), Boolean.parseBoolean(""+tcl.getNewValue()));
+ }
+ };
+
+ TableCellListener tcl = new TableCellListener(jTable1, action);
+
+ // status bar initialization - message timeout, idle icon and busy animation, etc
+ ResourceMap resourceMap = getResourceMap();
+ int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");
+ messageTimer = new Timer(messageTimeout, new ActionListener() {
+
+ public void actionPerformed(ActionEvent e) {
+ statusMessageLabel.setText("");
+ }
+ });
+
+ messageTimer.setRepeats(
+ false);
+ int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");
+
+ for (int i = 0;
+ i < busyIcons.length;
+ i++) {
+ busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");
+ }
+ busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {
+
+ public void actionPerformed(ActionEvent e) {
+ busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
+ statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
+ }
+ });
+ idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
+
+ statusAnimationLabel.setIcon(idleIcon);
+
+ progressBar.setVisible(
+ false);
+
+ // connecting action tasks to status bar via TaskMonitor
+ TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
+
+ taskMonitor.addPropertyChangeListener(
+ new java.beans.PropertyChangeListener() {
+
+ public void propertyChange(java.beans.PropertyChangeEvent evt) {
+ String propertyName = evt.getPropertyName();
+ if ("started".equals(propertyName)) {
+ if (!busyIconTimer.isRunning()) {
+ statusAnimationLabel.setIcon(busyIcons[0]);
+ busyIconIndex = 0;
+ busyIconTimer.start();
+ }
+ progressBar.setVisible(true);
+ progressBar.setIndeterminate(true);
+ } else if ("done".equals(propertyName)) {
+ busyIconTimer.stop();
+ statusAnimationLabel.setIcon(idleIcon);
+ progressBar.setVisible(false);
+ progressBar.setValue(0);
+ } else if ("message".equals(propertyName)) {
+ String text = (String) (evt.getNewValue());
+ statusMessageLabel.setText((text == null) ? "" : text);
+ messageTimer.restart();
+ } else if ("progress".equals(propertyName)) {
+ int value = (Integer) (evt.getNewValue());
+ progressBar.setVisible(true);
+ progressBar.setIndeterminate(false);
+ progressBar.setValue(value);
+ }
+ }
+ });
+ }
+
+ @Action
+ public void showAboutBox() {
+ if (aboutBox == null) {
+ JFrame mainFrame = Tubes5ProginApp.getApplication().getMainFrame();
+ aboutBox = new Tubes5ProginAboutBox(mainFrame);
+ aboutBox.setLocationRelativeTo(mainFrame);
+ }
+ Tubes5ProginApp.getApplication().show(aboutBox);
+ }
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ @SuppressWarnings("unchecked")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ mainPanel = new javax.swing.JPanel();
+ jButton1 = new javax.swing.JButton();
+ jPasswordField1 = new javax.swing.JPasswordField();
+ jLabel1 = new javax.swing.JLabel();
+ jTextField1 = new javax.swing.JTextField();
+ jLabel2 = new javax.swing.JLabel();
+ jLabel3 = new javax.swing.JLabel();
+ jScrollPane1 = new javax.swing.JScrollPane();
+ jTable1 = new javax.swing.JTable();
+ jButton3 = new javax.swing.JButton();
+ menuBar = new javax.swing.JMenuBar();
+ javax.swing.JMenu fileMenu = new javax.swing.JMenu();
+ javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem();
+ jMenuItem1 = new javax.swing.JMenuItem();
+ javax.swing.JMenu helpMenu = new javax.swing.JMenu();
+ javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem();
+ statusPanel = new javax.swing.JPanel();
+ javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator();
+ statusMessageLabel = new javax.swing.JLabel();
+ statusAnimationLabel = new javax.swing.JLabel();
+ progressBar = new javax.swing.JProgressBar();
+ jButton2 = new javax.swing.JButton();
+
+ org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(tubes5progin.Tubes5ProginApp.class).getContext().getResourceMap(Tubes5ProginView.class);
+ mainPanel.setBackground(resourceMap.getColor("mainPanel.background")); // NOI18N
+ mainPanel.setForeground(resourceMap.getColor("mainPanel.foreground")); // NOI18N
+ mainPanel.setName("mainPanel"); // NOI18N
+ mainPanel.setPreferredSize(new java.awt.Dimension(537, 402));
+
+ javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(tubes5progin.Tubes5ProginApp.class).getContext().getActionMap(Tubes5ProginView.class, this);
+ jButton1.setAction(actionMap.get("OnClickOk")); // NOI18N
+ jButton1.setText(resourceMap.getString("jButton1.text")); // NOI18N
+ jButton1.setName("jButton1"); // NOI18N
+
+ jPasswordField1.setName("Password"); // NOI18N
+
+ jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
+ jLabel1.setName("jLabel1"); // NOI18N
+
+ jTextField1.setText(resourceMap.getString("jTextField1.text")); // NOI18N
+ jTextField1.setName("jTextField1"); // NOI18N
+
+ jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N
+ jLabel2.setName("jLabel2"); // NOI18N
+
+ jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N
+ jLabel3.setName("jLabel3"); // NOI18N
+
+ jScrollPane1.setName("jScrollPane1"); // NOI18N
+
+ jTable1.setBackground(resourceMap.getColor("jTable1.background")); // NOI18N
+ jTable1.setModel(new javax.swing.table.DefaultTableModel(
+ new Object [][] {
+ {null, null, null, null},
+ {null, null, null, null},
+ {null, null, null, null},
+ {null, null, null, null}
+ },
+ new String [] {
+ "Title 1", "Title 2", "Title 3", "Title 4"
+ }
+ ) {
+ Class[] types = new Class [] {
+ java.lang.Boolean.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class
+ };
+ boolean[] canEdit = new boolean [] {
+ true, false, true, true
+ };
+
+ public Class getColumnClass(int columnIndex) {
+ return types [columnIndex];
+ }
+
+ public boolean isCellEditable(int rowIndex, int columnIndex) {
+ return canEdit [columnIndex];
+ }
+ });
+ jTable1.setGridColor(resourceMap.getColor("jTable1.gridColor")); // NOI18N
+ jTable1.setName("jTable1"); // NOI18N
+ jScrollPane1.setViewportView(jTable1);
+ jTable1.getColumnModel().getColumn(0).setHeaderValue(resourceMap.getString("jTable1.columnModel.title0")); // NOI18N
+ jTable1.getColumnModel().getColumn(1).setHeaderValue(resourceMap.getString("jTable1.columnModel.title1")); // NOI18N
+ jTable1.getColumnModel().getColumn(2).setHeaderValue(resourceMap.getString("jTable1.columnModel.title2")); // NOI18N
+ jTable1.getColumnModel().getColumn(3).setHeaderValue(resourceMap.getString("jTable1.columnModel.title3")); // NOI18N
+
+ jButton3.setText(resourceMap.getString("jButton3.text")); // NOI18N
+ jButton3.setName("jButton3"); // NOI18N
+ jButton3.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ jButton3ActionPerformed(evt);
+ }
+ });
+
+ javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
+ mainPanel.setLayout(mainPanelLayout);
+ mainPanelLayout.setHorizontalGroup(
+ mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(mainPanelLayout.createSequentialGroup()
+ .addGap(18, 18, 18)
+ .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 634, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGroup(mainPanelLayout.createSequentialGroup()
+ .addComponent(jLabel2)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGap(18, 18, 18)
+ .addComponent(jLabel1)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(jPasswordField1, javax.swing.GroupLayout.PREFERRED_SIZE, 95, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(jButton1)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(jLabel3)
+ .addGap(27, 27, 27)
+ .addComponent(jButton3)))
+ .addContainerGap(18, Short.MAX_VALUE))
+ );
+ mainPanelLayout.setVerticalGroup(
+ mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(mainPanelLayout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabel2)
+ .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel1)
+ .addComponent(jPasswordField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jButton1)
+ .addComponent(jLabel3)
+ .addComponent(jButton3))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 13, Short.MAX_VALUE)
+ .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE))
+ );
+
+ menuBar.setName("menuBar"); // NOI18N
+
+ fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
+ fileMenu.setName("fileMenu"); // NOI18N
+
+ exitMenuItem.setAction(actionMap.get("quit")); // NOI18N
+ exitMenuItem.setName("exitMenuItem"); // NOI18N
+ fileMenu.add(exitMenuItem);
+
+ jMenuItem1.setText(resourceMap.getString("jMenuItem1.text")); // NOI18N
+ jMenuItem1.setName("jMenuItem1"); // NOI18N
+ fileMenu.add(jMenuItem1);
+
+ menuBar.add(fileMenu);
+
+ helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N
+ helpMenu.setName("helpMenu"); // NOI18N
+
+ aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
+ aboutMenuItem.setName("aboutMenuItem"); // NOI18N
+ helpMenu.add(aboutMenuItem);
+
+ menuBar.add(helpMenu);
+
+ statusPanel.setName("statusPanel"); // NOI18N
+
+ statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N
+
+ statusMessageLabel.setName("statusMessageLabel"); // NOI18N
+
+ statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
+ statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N
+
+ javax.swing.GroupLayout statusPanelLayout = new javax.swing.GroupLayout(statusPanel);
+ statusPanel.setLayout(statusPanelLayout);
+ statusPanelLayout.setHorizontalGroup(
+ statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(statusPanelSeparator, javax.swing.GroupLayout.DEFAULT_SIZE, 670, Short.MAX_VALUE)
+ .addGroup(statusPanelLayout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(statusMessageLabel)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 650, Short.MAX_VALUE)
+ .addComponent(statusAnimationLabel)
+ .addContainerGap())
+ );
+ statusPanelLayout.setVerticalGroup(
+ statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(statusPanelLayout.createSequentialGroup()
+ .addComponent(statusPanelSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(statusMessageLabel)
+ .addComponent(statusAnimationLabel))
+ .addGap(3, 3, 3))
+ );
+
+ progressBar.setName("progressBar"); // NOI18N
+
+ jButton2.setText(resourceMap.getString("jButton2.text")); // NOI18N
+ jButton2.setName("jButton2"); // NOI18N
+
+ setComponent(mainPanel);
+ setMenuBar(menuBar);
+ setStatusBar(statusPanel);
+ }// //GEN-END:initComponents
+
+private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed
+// TODO add your handling code here:
+ client.logout();
+ jTable1.setVisible(false);
+ jTextField1.setText("");
+ jPasswordField1.setText("");
+ jButton1.setVisible(true);
+ jLabel1.setVisible(true);
+ jLabel2.setVisible(true);
+ jTextField1.setVisible(true);
+ jPasswordField1.setVisible(true);
+ jButton3.setVisible(false);
+ jLabel3.setVisible(false);
+ jScrollPane1.setVisible(false);
+}//GEN-LAST:event_jButton3ActionPerformed
+ @Action
+ public void OnClickOk() {
+ client.Login(jTextField1.getText(), jPasswordField1.getText());
+
+ //JOptionPane j;
+ if (client.isLogin()) {
+ jLabel1.setVisible(false);
+ jLabel2.setVisible(false);
+ jPasswordField1.setVisible(false);
+ jTextField1.setVisible(false);
+ jButton1.setVisible(false);
+ jLabel3.setVisible(true);
+ jLabel3.setText(jTextField1.getText());
+ jTable1.setVisible(true);
+ jScrollPane1.setVisible(true);
+ jButton3.setVisible(true);
+
+
+ sync();
+ } else {
+ JOptionPane.showMessageDialog(null,"Password atau Username salah! Ulangi lagi");
+ jTextField1.setText("");
+ jPasswordField1.setText("");
+ }
+ }
+
+ public void sync() {
+ client.sync();
+ Task = client.getTasks();
+
+ Object data[][];
+ data = new Object[Task.size()][6];
+ for (int i = 0; i < Task.size(); i++) {
+ data[i][0] = Task.get(i).getNama();
+ data[i][1] = Task.get(i).getDeadline();
+ data[i][2] = Task.get(i).getAssignee();
+ data[i][3] = Task.get(i).getTag();
+ data[i][4] = Task.get(i).isStatus();
+ data[i][5] = Task.get(i).getKategori();
+ }
+ jTable1.setModel(new javax.swing.table.DefaultTableModel(
+ data,
+ new Object[]{
+ "Nama Tugas", "Deadline", "Assignee", "Tag", "Status", "Kategori"
+ }) {
+
+ Class[] types = new Class[]{
+ java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Boolean.class, java.lang.Object.class
+ };
+ boolean[] canEdit = new boolean[]{
+ false, false, false, false, true, false
+ };
+
+ public Class getColumnClass(int columnIndex) {
+ return types[columnIndex];
+ }
+ });
+ }
+
+ public javax.swing.JTable getTable() {
+ return jTable1;
+ }
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton jButton1;
+ private javax.swing.JButton jButton2;
+ private javax.swing.JButton jButton3;
+ private javax.swing.JLabel jLabel1;
+ private javax.swing.JLabel jLabel2;
+ private javax.swing.JLabel jLabel3;
+ private javax.swing.JMenuItem jMenuItem1;
+ private javax.swing.JPasswordField jPasswordField1;
+ private javax.swing.JScrollPane jScrollPane1;
+ private javax.swing.JTable jTable1;
+ private javax.swing.JTextField jTextField1;
+ private javax.swing.JPanel mainPanel;
+ private javax.swing.JMenuBar menuBar;
+ private javax.swing.JProgressBar progressBar;
+ private javax.swing.JLabel statusAnimationLabel;
+ private javax.swing.JLabel statusMessageLabel;
+ private javax.swing.JPanel statusPanel;
+ // End of variables declaration//GEN-END:variables
+ private final Timer messageTimer;
+ private final Timer busyIconTimer;
+ private final Icon idleIcon;
+ private final Icon[] busyIcons = new Icon[15];
+ private int busyIconIndex = 0;
+ private JDialog aboutBox;
+ public int Pilihan;
+}
diff --git a/Tubes5-Progin/src/tubes5progin/resources/Alert.properties b/Tubes5-Progin/src/tubes5progin/resources/Alert.properties
new file mode 100644
index 00000000..0f7bac8b
--- /dev/null
+++ b/Tubes5-Progin/src/tubes5progin/resources/Alert.properties
@@ -0,0 +1,3 @@
+jLabel1.text=Username
+jLabel2.text=Password
+jButton1.text=Ok
diff --git a/Tubes5-Progin/src/tubes5progin/resources/HalamanUtama.properties b/Tubes5-Progin/src/tubes5progin/resources/HalamanUtama.properties
new file mode 100644
index 00000000..448e8a38
--- /dev/null
+++ b/Tubes5-Progin/src/tubes5progin/resources/HalamanUtama.properties
@@ -0,0 +1,16 @@
+# To change this template, choose Tools | Templates
+# and open the template in the editor.
+
+editMenu.text=Edit
+cutMenuItem.text=Cut
+helpMenu.text=Help
+deleteMenuItem.text=Delete
+pasteMenuItem.text=Paste
+copyMenuItem.text=Copy
+saveMenuItem.text=Save
+contentsMenuItem.text=Contents
+saveAsMenuItem.text=Save As ...
+aboutMenuItem.text=About
+fileMenu.text=File
+openMenuItem.text=Open
+exitMenuItem.text=Exit
diff --git a/Tubes5-Progin/src/tubes5progin/resources/Main.properties b/Tubes5-Progin/src/tubes5progin/resources/Main.properties
new file mode 100644
index 00000000..2cdc95c0
--- /dev/null
+++ b/Tubes5-Progin/src/tubes5progin/resources/Main.properties
@@ -0,0 +1,2 @@
+
+jTable1.columnModel.title0=Nama Tugas
diff --git a/Tubes5-Progin/src/tubes5progin/resources/Tubes5ProginAboutBox.properties b/Tubes5-Progin/src/tubes5progin/resources/Tubes5ProginAboutBox.properties
new file mode 100644
index 00000000..b76ddd5f
--- /dev/null
+++ b/Tubes5-Progin/src/tubes5progin/resources/Tubes5ProginAboutBox.properties
@@ -0,0 +1,14 @@
+title = About: ${Application.title} ${Application.version}
+
+closeAboutBox.Action.text = &Close
+
+appDescLabel.text=${Application.description}
+
+versionLabel.text=Product Version\:
+
+vendorLabel.text=Vendor\:
+
+homepageLabel.text=Homepage\:
+
+#NOI18N
+imageLabel.icon=about.png
diff --git a/Tubes5-Progin/src/tubes5progin/resources/Tubes5ProginApp.properties b/Tubes5-Progin/src/tubes5progin/resources/Tubes5ProginApp.properties
new file mode 100644
index 00000000..7af8304a
--- /dev/null
+++ b/Tubes5-Progin/src/tubes5progin/resources/Tubes5ProginApp.properties
@@ -0,0 +1,11 @@
+# Application global resources
+
+Application.name = Tubes5-Progin
+Application.title = Basic Application Example
+Application.version = 1.0
+Application.vendor = Sun Microsystems Inc.
+Application.homepage = http\://appframework.dev.java.net/
+Application.description = A simple Java desktop application based on Swing Application Framework.
+Application.vendorId = Sun
+Application.id = ${Application.name}
+Application.lookAndFeel = system
diff --git a/Tubes5-Progin/src/tubes5progin/resources/Tubes5ProginView.properties b/Tubes5-Progin/src/tubes5progin/resources/Tubes5ProginView.properties
new file mode 100644
index 00000000..dbf03362
--- /dev/null
+++ b/Tubes5-Progin/src/tubes5progin/resources/Tubes5ProginView.properties
@@ -0,0 +1,53 @@
+
+# @Action resources
+
+showAboutBox.Action.text = &About...
+showAboutBox.Action.shortDescription = Show the application's information dialog
+
+# status bar resources
+
+StatusBar.messageTimeout = 5000
+StatusBar.busyAnimationRate = 30
+StatusBar.idleIcon = busyicons/idle-icon.png
+StatusBar.busyIcons[0] = busyicons/busy-icon0.png
+StatusBar.busyIcons[1] = busyicons/busy-icon1.png
+StatusBar.busyIcons[2] = busyicons/busy-icon2.png
+StatusBar.busyIcons[3] = busyicons/busy-icon3.png
+StatusBar.busyIcons[4] = busyicons/busy-icon4.png
+StatusBar.busyIcons[5] = busyicons/busy-icon5.png
+StatusBar.busyIcons[6] = busyicons/busy-icon6.png
+StatusBar.busyIcons[7] = busyicons/busy-icon7.png
+StatusBar.busyIcons[8] = busyicons/busy-icon8.png
+StatusBar.busyIcons[9] = busyicons/busy-icon9.png
+StatusBar.busyIcons[10] = busyicons/busy-icon10.png
+StatusBar.busyIcons[11] = busyicons/busy-icon11.png
+StatusBar.busyIcons[12] = busyicons/busy-icon12.png
+StatusBar.busyIcons[13] = busyicons/busy-icon13.png
+StatusBar.busyIcons[14] = busyicons/busy-icon14.png
+OnClickOk.Action.text=aaaa
+OnClickOk.Action.shortDescription=
+jLabel1.text=Password
+jTextField1.text=
+jLabel2.text=Username
+jLabel3.text=jLabel3
+jTable1.columnModel.title0=Title 1
+jTable1.columnModel.title3=Title 4
+jTable1.columnModel.title2=Title 3
+jTable1.columnModel.title1=Title 2
+jButton2.text=jButton2
+#NOI18N
+mainPanel.background=0, 204, 51
+#NOI18N
+mainPanel.foreground=0, 0, 0
+helpMenu.text=Help
+# Resources for the Tubes5ProginView class
+
+# top-level menus
+fileMenu.text=File
+jButton3.text=Logout
+jMenuItem1.text=Logout
+jButton1.text=OK
+#NOI18N
+jTable1.background=153, 255, 153
+#NOI18N
+jTable1.gridColor=204, 204, 204
diff --git a/Tubes5-Progin/src/tubes5progin/resources/about.png b/Tubes5-Progin/src/tubes5progin/resources/about.png
new file mode 100644
index 00000000..c6dfe0a5
Binary files /dev/null and b/Tubes5-Progin/src/tubes5progin/resources/about.png differ
diff --git a/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon0.png b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon0.png
new file mode 100644
index 00000000..242c0c85
Binary files /dev/null and b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon0.png differ
diff --git a/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon1.png b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon1.png
new file mode 100644
index 00000000..9f6f6343
Binary files /dev/null and b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon1.png differ
diff --git a/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon10.png b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon10.png
new file mode 100644
index 00000000..c4ef4a1f
Binary files /dev/null and b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon10.png differ
diff --git a/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon11.png b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon11.png
new file mode 100644
index 00000000..6eca1f5e
Binary files /dev/null and b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon11.png differ
diff --git a/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon12.png b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon12.png
new file mode 100644
index 00000000..e447ee8a
Binary files /dev/null and b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon12.png differ
diff --git a/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon13.png b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon13.png
new file mode 100644
index 00000000..848a6f1a
Binary files /dev/null and b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon13.png differ
diff --git a/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon14.png b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon14.png
new file mode 100644
index 00000000..7b3561df
Binary files /dev/null and b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon14.png differ
diff --git a/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon2.png b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon2.png
new file mode 100644
index 00000000..c866e62a
Binary files /dev/null and b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon2.png differ
diff --git a/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon3.png b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon3.png
new file mode 100644
index 00000000..9be22fa5
Binary files /dev/null and b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon3.png differ
diff --git a/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon4.png b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon4.png
new file mode 100644
index 00000000..f07c20dc
Binary files /dev/null and b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon4.png differ
diff --git a/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon5.png b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon5.png
new file mode 100644
index 00000000..653fc9c3
Binary files /dev/null and b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon5.png differ
diff --git a/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon6.png b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon6.png
new file mode 100644
index 00000000..70355726
Binary files /dev/null and b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon6.png differ
diff --git a/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon7.png b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon7.png
new file mode 100644
index 00000000..49fbc6ec
Binary files /dev/null and b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon7.png differ
diff --git a/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon8.png b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon8.png
new file mode 100644
index 00000000..e1a5a409
Binary files /dev/null and b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon8.png differ
diff --git a/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon9.png b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon9.png
new file mode 100644
index 00000000..82780123
Binary files /dev/null and b/Tubes5-Progin/src/tubes5progin/resources/busyicons/busy-icon9.png differ
diff --git a/Tubes5-Progin/src/tubes5progin/resources/busyicons/idle-icon.png b/Tubes5-Progin/src/tubes5progin/resources/busyicons/idle-icon.png
new file mode 100644
index 00000000..50312f85
Binary files /dev/null and b/Tubes5-Progin/src/tubes5progin/resources/busyicons/idle-icon.png differ
diff --git a/Tubes5-Progin/src/tubes5progin/resources/splash.png b/Tubes5-Progin/src/tubes5progin/resources/splash.png
new file mode 100644
index 00000000..a1fbdc10
Binary files /dev/null and b/Tubes5-Progin/src/tubes5progin/resources/splash.png differ
diff --git a/Tubes5-Progin/wilson_log.txt b/Tubes5-Progin/wilson_log.txt
new file mode 100644
index 00000000..82900527
--- /dev/null
+++ b/Tubes5-Progin/wilson_log.txt
@@ -0,0 +1,4 @@
+update#15#false#1369035985466
+update#15#true#1369035989616
+update#15#false#1369036447465
+update#15#true#1369036459274