ΤΕΛΙΚΗ ΕΡΓΑΣΙΑ

Στόχος της εργασίας αυτής είναι η ανάπτυξη ενός πολύ απλού text editor για την δημιουργία και μεταγλώττιση C# κώδικα και η χρήση μιας βιβλιοθήκης τρίτου πάροχου (το iText) για την αποθήκευση του κώδικα σε μορφή PDF. Ο text editor θα πρέπει να υλοποιεί κάποιες λειτουργίες που περιγράφονται παρακάτω και πρέπει να χρησιμοποιήσετε ως specification της εφαρμογής σας.

Περιγραφή

Η εφαρμογή θα είναι μια windowsformμε τα εξής χαρακτηριστικά:

A - Περιγραφή παραθύρου

Στο πάνω μέρος του παραθύρου θα υπάρχει ένα οριζόντιο μενού με τις εξής επιλογές :

·

Το κύριο μέρος του παραθύρου θα έχει τον editor που θα χρησιμοποιεί ο χρήστης για την επεξεργασία ενός αρχείου πηγαίου κώδικα C#. Θα πρέπει να επιλέξετε το κατάλληλο control που δέχεται και θα εμφανίζει μορφοποίηση κειμένου.

  • File :

    • New : Δημιουργία νέου αρχείου. Θα εμφανίζεται παράθυρο διαλόγου ζητώντας το όνομα του αρχείου και το directory στο οποίο θα αποθηκευτεί. Με τη δημιουργία του αρχείου προστίθεται μέσα του η δομή της κλάσης του, για παράδειγμα class MyClass{}.
    • Open : Θα ανοίγει αρχεία με πηγαίο κώδικα C# (με κατάληξη .cs).
    • Save : Θα αποθηκεύει το τρέχον snippet στο ίδιο αρχείο με αυτό που προσδιορίστηκε κατά τη δημιουργία του.
    • Save as : Θα εμφανίζει παράθυρο διαλόγου όπου θα ζητούνται το όνομα του αρχείου, το format του και το directory στο οποίο θα αποθηκευτεί. Το format θα είναι ένα εκ των a) αρχείο cs (.cs) b) αρχείο PDF (.pdf). Ο κώδικας cs που θα αποθηκεύεται σε pdf μορφή θα αποθηκεύεται μορφοποιημένος. Οι κανόνες μορφοποίησης θα αναφερθούν στην συνέχεια.
Το κάτω μέρος του παραθύρου όπου θα εμφανίζεται :
  • Ένα status bar με τις παρακάτω πληροφορίες που θα ανανεώνονται κατά την επεξεργασία ενός snippet :
  • Πλήθος γραμμών
  • Πλήθος δεσμευμένων λέξεων C# στον πηγαίο κώδικα

Όλα τα controls θα πρέπει να έχουν δυνατότητα scrolling σε περίπτωση που το περιεχόμενό τους είναι μεγαλύτερο από αυτό που χωράει.

Το παράθυρο θα μοιάζει σαν το παρακάτω mock prototype:

mock

Μορφοποίηση κειμένου

Κάθε αρχείο θα ανοίγει μορφοποιημένο και θα μορφοποιείται και κατά την επεξεργασία του με τους ακόλουθους κανόνες:

  • Οι δεσμευμένες λέξεις της C# θα εμφανίζονται με χρώμα μπλε.
  • Τα σχόλια θα εμφανίζονται με χρώμα πράσινο
  • Τα String literals με χρώμα πορτοκαλί
  • Όλα τα υπόλοιπα με χρώμα μαύρο
  • To Font θαείναι Courier
  • Font size 12pt

Όταν αποθηκεύεται ένα snippet σε plain text format (.cs) η μορφοποίηση θα αγνοείται, ενώ θα αποθηκεύεται σε pdf μορφοποιημένο.

Για την υλοποίηση της μορφοποίησης θα βοηθήσει αρκετά η μοντελοποίηση των παραπάνω με χρήση regular expressions. Η ταυτόχρονη μορφοποίηση κατά την επεξεργασία του κειμένου υπονοεί τη χρήση threads.

Οδηγίες

Η δημιουργία του παραθύρου αποτελείται ουσιαστικά από την επιλογή των κατάλληλων controls, την τοποθέτησή τους στο παράθυρο και τον χειρισμό των events που θα προκύπτουν από τα controls.

Η διαδικασία της μορφοποίησης θα γίνεται α) μία φορά κατά το άνοιγμα ενός αρχείου cs και β) ταυτόχρονα με την επεξεργασία του αρχείου cs έτσι ώστε οι λέξεις να μορφοποιούνται ταυτόχρονα με το γράψιμό τους. Η μορφοποίηση ουσιαστικά θα αποτελείται από την απομόνωση των λέξεων έτσι ώστε να βρεθεί ποιές από αυτές είναι δεσμευμένες. Ουσιαστικά εκτελούμε τη μέθοδο find που είχαμε υλοποιήσει στην ενότητα 7, αλλά αντί να ψάχνουμε για έναν όρο, ψάχνουμε για όλες τις δεσμευμένες λέξεις. Τις δεσμευμένες λέξεις της cs μπορούμε να τις έχετε hardcoded μέσα στον κώδικά μας δημιουργώντας το κατάλληλο collection για το χειρισμό τους ή ακόμα καλύτερα χρησιμοποιώντας ένα regularexpression (ο δεύτερος τρόπος είναι πιο εύκολος). Τις λέξεις αυτές μπορείτε να τις βρείτε εδώ. Όπως αναφέραμε η διαδικασία της μορφοποίησης θα πρέπει να εκτελείται και ταυτόχρονα κατά την επεξεργασία του κώδικα. Αυτό σημαίνει ότι θα πρέπει να εκτελείται σε ξεχωριστό thread γιατί αλλιώς το παράθυρο θα μπλοκάρει. Μια προσέγγιση είναι να δημιουργήσουμε ένα thread το οποίο θα εκτελεί τη διαδικασία της μορφοποίησης συνέχεια.

Αφού έχει τελειώσει η επεξεργασία του κώδικα, υπάρχει η δυνατότητα αποθήκευσής της σε μορφή PDF. Αφού μελετήσετε τις δυνατότητες της βιβλιοθήκης αλλά και τα έτοιμα παραδείγματα που δίνονται εδώ, θα πρέπει να μεταφέρουμε το κείμενο μορφοποιημένο σε ένα έγγραφο PDF. Μια προσέγγιση θα ήταν να διατρέξουμε τον μορφοποιημένο κώδικα, να αναγνωρίσουμε την μορφοποίηση (ούτως ή αλλως είναι λίγοι οι κανόνες μορφοποίησης) να την "μεταφράσουμε" στον αντίστοιχο κώδικα του iText και να το αποθηκεύσουμε σε μορφή PDF. Όλος ο κώδικας που θα χρειαστείτε υπάρχει στα παραδείγματα, οπότε αυτό που έχετε να κάνετε ουσιαστικά είναι να βρείτε ποιό είναι το πιο κατάλληλο για την εφαρμογή.

Καλό θα είναι να απομονώσουμε την υλοποίηση της μορφοποίησης εκτός του GUI, σε μια ξεχωριστή κλάση, έτσι ώστε αν θελήσουμε στο μέλλον να αλλάξουμε τη μορφοποίηση να επέμβουμε μόνο στην κλάση αυτή. Μια βοηθητική κλάση για το σκοπό αυτό θα μπορούσε να έχει την εξής μορφή:

Το παραπάνω σχήμα είναι ένα Class Diagram της κλάσης MyDocument που αναπαριστά το κείμενο που βλέπουμε στον editor. Η κύρια χρήση της είναι να κάνει τις κατάλληλες ενέργειες έτσι ώστε να αποθηκευτεί σε μορφή PDF.

Παρατηρούμε τη μορφή του class diagram. Ομαδοποιεί τα μέλη της κλάσης σε πεδία, μεθόδους και τους ενσωματωμένους τύπους (στο συγκεκριμένο παράδειγμα έχουμε μόνο έναν). Ένα μέλος έχει το μπλε σύμβολο αν είναι πεδίο και το ροζ αν είναι μέθοδος. Αν ένα μέλος έχει ένα λουκέτο μπροστά του τότε είναι private. Επίσης παρατηρούμε τον τύπο δεδομένων κάθε πεδίου μετά την άνω και κάτω τελεία. Γενικότερα παρέχεται όλη η υπογραφή μιας μεθόδου.

Η μορφοποίηση του κειμένου γίνεται κατά τη δημιουργία της παραγράφου (δηλαδή στον constructor). Η παράγραφος δέχεται το κείμενο χωρίς μορφοποίηση και το μορφοποιεί καλώντας μια από τις μεθόδους της εσωτερικής κλάσης MyParagraph. Παρατηρούμε ότι είναι και private, αφού ουσιαστικά χρησιμέυουν μόνο σε αυτή. Οι μέθοδοι Add* προσθέτουν την κατάλληλη γραμματοσειρά και χρώμα στην παράγραφο και παρατηρούμε ότι είναι μια για κάθε κανόνα. Τέλος υπάρχει η μέθοδος Save της MyDocument που αποθηκεύει κάθε παράγραφο του κειμένου σε ένα αρχείο pdf.

Η παραπάνω κλάση είναι μια πιθανή προσέγγιση και σίγουρα δεν είναι η βέλτιστη. Αυτό που παρέχει ωστόσο είναι μια ανεξαρτησία από το GUI. Κατά το πάτημα του μενού Save as... PDF το μόνο που έχει να γίνει στην ουσία είναι μια κλήση στην AddParagraph και μια στη Save. Αυτό μας δίνει ιδιαίτερη ευελιξία.

Φυσικά μπορείτε να υλοποιήσετε τη δική σας προσέγγιση.

Παραδοτέα

  • Το τελικό projectτου VS
  • Μια σύντομη αναφορά που θα περιέχει τι κάνατε και πως ή/και τι δεν κάνατε και γιατί.
  • Πακετάρετε όλα τα παραπάνω σε ένα αρχείο zip, το όνομα του οποίου θα έχει την εξής μορφή:
  • FINAL_EPONYMO_ONOMA.zip π.χ FINAL_KOLIAS_VASILIS.zip και ανεβάστε το στην φόρμα παρακάτω φόρμα.