diff --git a/.gradle/9.3.1/executionHistory/executionHistory.bin b/.gradle/9.3.1/executionHistory/executionHistory.bin index 855f95c..1d8e1c2 100755 Binary files a/.gradle/9.3.1/executionHistory/executionHistory.bin and b/.gradle/9.3.1/executionHistory/executionHistory.bin differ diff --git a/.gradle/9.3.1/executionHistory/executionHistory.lock b/.gradle/9.3.1/executionHistory/executionHistory.lock index 169f2c3..cb98617 100755 Binary files a/.gradle/9.3.1/executionHistory/executionHistory.lock and b/.gradle/9.3.1/executionHistory/executionHistory.lock differ diff --git a/.gradle/9.3.1/fileHashes/fileHashes.bin b/.gradle/9.3.1/fileHashes/fileHashes.bin index 3db4444..61b8b51 100755 Binary files a/.gradle/9.3.1/fileHashes/fileHashes.bin and b/.gradle/9.3.1/fileHashes/fileHashes.bin differ diff --git a/.gradle/9.3.1/fileHashes/fileHashes.lock b/.gradle/9.3.1/fileHashes/fileHashes.lock index d737ca8..8d8daee 100755 Binary files a/.gradle/9.3.1/fileHashes/fileHashes.lock and b/.gradle/9.3.1/fileHashes/fileHashes.lock differ diff --git a/.gradle/9.3.1/fileHashes/resourceHashesCache.bin b/.gradle/9.3.1/fileHashes/resourceHashesCache.bin index 6926026..6f49e3e 100755 Binary files a/.gradle/9.3.1/fileHashes/resourceHashesCache.bin and b/.gradle/9.3.1/fileHashes/resourceHashesCache.bin differ diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 28e5aea..8c66e33 100755 Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin index e8a51d8..014668a 100755 Binary files a/.gradle/buildOutputCleanup/outputFiles.bin and b/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe index 796d40a..d3d01cb 100755 Binary files a/.gradle/file-system.probe and b/.gradle/file-system.probe differ diff --git a/.project b/.project index 82c52ab..52c68db 100644 --- a/.project +++ b/.project @@ -15,8 +15,14 @@ + + org.eclipse.ajdt.core.ajbuilder + + + + org.eclipse.ajdt.ui.ajnature org.eclipse.jdt.core.javanature org.eclipse.buildship.core.gradleprojectnature diff --git a/build.gradle b/build.gradle index c39434f..b7f1ebf 100755 --- a/build.gradle +++ b/build.gradle @@ -5,6 +5,7 @@ plugins { id 'application' + id("io.freefair.aspectj") version "9.2.0" id("org.openjfx.javafxplugin") version "0.1.0" } @@ -36,7 +37,7 @@ sourceSets { javafx { version = "25.0.2" - modules = [ 'javafx.controls', 'javafx.fxml', 'javafx.graphics' ] + modules = [ 'javafx.controls', 'javafx.fxml'] } dependencies { diff --git a/db/sample.db b/db/sample.db index d2a9158..edc5340 100644 Binary files a/db/sample.db and b/db/sample.db differ diff --git a/src/main/java/edu/bookocontacts/ControlDDXDialog.java b/src/main/java/edu/bookocontacts/ControlDDXDialog.java index b96c351..1e95899 100644 --- a/src/main/java/edu/bookocontacts/ControlDDXDialog.java +++ b/src/main/java/edu/bookocontacts/ControlDDXDialog.java @@ -40,12 +40,13 @@ public class ControlDDXDialog extends Dialog { @FXML private TextField tfZip; - public ControlDDXDialog() { + public ControlDDXDialog(Contact ct) { super(); String fxml = "/media/ControlAddressDDXDialog.fxml"; FXMLLoader fxmlLoader = new FXMLLoader(getClass().getClassLoader().getResource(fxml)); fxmlLoader.setController(this); fxmlLoader.setLocation(getClass().getResource(fxml)); + try { fxmlLoader.load(); } catch (IOException exception) { @@ -55,12 +56,25 @@ public class ControlDDXDialog extends Dialog { getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL); setTitle("Contact Address Dialog"); setHeaderText(String.format("Enter Contact Details")); - setPropertyBindings(); + + setPropertyBindings(ct); + setResultConverter(); } - private void setPropertyBindings() { + private void setPropertyBindings(Contact ct) { Logger.getLogger(getClass().getName()).log(Level.INFO, "setPropertyBindings called."); + if (ct == null) { + return; + } + tfFirstName.setText(ct.getFirst_name()); + tfLastName.setText(ct.getLast_name()); + tfPhoneNo.setText(ct.getPhoneNo().getphone_number()); + tfEmail.setText(ct.getEmail().getEmail_address()); + tfStreet.setText(ct.getMailing_address().getStreet()); + tfCity.setText(ct.getMailing_address().getStreet()); + tfState.setText(ct.getMailing_address().getState()); + tfZip.setText(ct.getMailing_address().getZip()); } private void setResultConverter() { diff --git a/src/main/java/edu/bookocontacts/StorageMonitor.aj b/src/main/java/edu/bookocontacts/StorageMonitor.aj new file mode 100644 index 0000000..41a2da7 --- /dev/null +++ b/src/main/java/edu/bookocontacts/StorageMonitor.aj @@ -0,0 +1,10 @@ +package edu.bookocontacts; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public aspect StorageMonitor { + + pointcut save(): execution(public * edu.bookocontacts.model.Factory.*(..)); + +} diff --git a/src/main/java/edu/bookocontacts/ViewController.java b/src/main/java/edu/bookocontacts/ViewController.java index 9ebe4ab..d90fc71 100755 --- a/src/main/java/edu/bookocontacts/ViewController.java +++ b/src/main/java/edu/bookocontacts/ViewController.java @@ -27,6 +27,8 @@ import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.control.cell.PropertyValueFactory; +import javafx.scene.input.MouseEvent; +import javafx.scene.input.PickResult; /** * FXML Controller class @@ -100,7 +102,7 @@ public class ViewController implements Initializable { @Override public void handle(javafx.event.ActionEvent t) { - ControlDDXDialog dialog = new ControlDDXDialog(); + ControlDDXDialog dialog = new ControlDDXDialog(contactView.getSelectionModel().getSelectedItem()); Optional result = dialog.showAndWait(); @@ -137,6 +139,26 @@ public class ViewController implements Initializable { updatecontactView(); } }); + + contactView.setOnMouseClicked(e -> { + + PickResult p = e.getPickResult(); + ControlDDXDialog dialog = new ControlDDXDialog(contactView.getSelectionModel().getSelectedItem()); + Optional result = dialog.showAndWait(); + if (result.isPresent()) { + log("result is present."); + // add to storage + Contact ct = (Contact) result.get(); + try { + ct.save(); + } catch (Exception ex) { + log(ex.getMessage()); + } + updatecontactView(); + } + + }); + } private void initializeTable() { diff --git a/src/main/java/edu/bookocontacts/model/DATASET.java b/src/main/java/edu/bookocontacts/model/DATASET.java index 50eb400..eae7f71 100644 --- a/src/main/java/edu/bookocontacts/model/DATASET.java +++ b/src/main/java/edu/bookocontacts/model/DATASET.java @@ -35,7 +35,8 @@ public interface DATASET { rs.getString("FIRST_NAME"), rs.getString("LAST_NAME"), new EmailAddress(rs.getString("EMAIL_ADDRESS")), - new PhoneNumber(rs.getString("PHONE_NUMBER"))); + new PhoneNumber(rs.getString("PHONE_NUMBER")), + new MailAddress(rs.getString("MAIL_ADDRESS"))); ct.status = EnumStatus.STORED; list.add(ct); } diff --git a/src/main/java/edu/bookocontacts/model/Factory.java b/src/main/java/edu/bookocontacts/model/Factory.java index f76550e..89e359b 100755 --- a/src/main/java/edu/bookocontacts/model/Factory.java +++ b/src/main/java/edu/bookocontacts/model/Factory.java @@ -10,14 +10,14 @@ import java.util.List; /** * */ -public interface Factory { +public final class Factory { public static List getAll(Contact clazz) { return DATASET.FINDDATA(); } static Contact createContact(Integer id, String first_name, String last_name, EmailAddress email, - PhoneNumber phone_number) { - Contact c = new Contact(first_name, last_name, email, phone_number, new MailAddress()); + PhoneNumber phone_number, MailAddress mail) { + Contact c = new Contact(first_name, last_name, email, phone_number, mail); c.setId(id); return c; diff --git a/src/main/java/edu/bookocontacts/model/MailAddress.java b/src/main/java/edu/bookocontacts/model/MailAddress.java index a23da52..cd40f41 100644 --- a/src/main/java/edu/bookocontacts/model/MailAddress.java +++ b/src/main/java/edu/bookocontacts/model/MailAddress.java @@ -1,6 +1,8 @@ package edu.bookocontacts.model; -public final class MailAddress{ +import java.util.Scanner; + +public final class MailAddress { String street; String city; @@ -8,7 +10,27 @@ public final class MailAddress{ String zip; public MailAddress() { - this("", "", "", ""); + this("", "", "", ""); + } + + public MailAddress(String addressline) { + this("", "", "", ""); + if (addressline != null) { + try (Scanner scanner = new Scanner(addressline)) { + try { + + scanner.useDelimiter(",\\s*"); + street = scanner.next(); + city = scanner.next(); + state = scanner.next(); + zip = scanner.next(); + + } catch (java.util.NoSuchElementException e) { + scanner.close(); + } + } + } + } public MailAddress(String street, String city, String state, String zip) { @@ -17,7 +39,7 @@ public final class MailAddress{ this.state = state; this.zip = zip; } - + public String getStreet() { return street; } @@ -50,12 +72,12 @@ public final class MailAddress{ this.zip = zip; } - public String getMailingAddress(){ - return String.format( "%s %s %s %s", formatField(this.street), formatField(this.city), this.state, this.zip ); + public String getMailingAddress() { + return String.format("%s %s %s %s", formatField(this.street), formatField(this.city), this.state, this.zip); } - private String formatField(String field){ - return field == null || field.isBlank()? "": field.trim() + ","; + private String formatField(String field) { + return field == null || field.isBlank() ? "" : field.trim() + ","; } @Override @@ -112,15 +134,15 @@ public final class MailAddress{ sb.append("}}"); return sb.toString(); } - + public Boolean isBlank() { - if(street.isBlank() && city.isBlank() && state.isBlank()) { - return true; - } - if( zip == null || zip.isBlank() ) { - return true; - } - return false; + if (street.isBlank() && city.isBlank() && state.isBlank()) { + return true; + } + if (zip == null || zip.isBlank()) { + return true; + } + return false; } } \ No newline at end of file