SwingPix Photo Organizer

Project Design Document

 

 

 

By:

            Justin Berstler

            Aju Mathew

            Yinka Ogungbemi

            Yinka Olabinjo

            John Rountree

            Mathew Schaffer

 

Submitted for Drexel University’s Software Engineering Workshop 2

Monday June 2, 2003

 

This document is also available at

http://swingpix.sourceforge.net/docs/design/


Document Revision History

 

Date

Revision

Description

3/7/2003

0.01

Initial document framework creation and front-matter creation

3/8/2003

0.1

Incorporation of implementation schedule

3/10/2003

1.0

Document completion

5/30/2003

1.1

Front-matter editing (Sections 1 and 2), initial editing in section 3

6/01/2003

1.2

Section 3 editing

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Table of Contents

1      Introduction.. 1

1.1        Purpose. 1

1.2        Audience. 1

1.3        References. 1

1.4        Document Overview.. 1

2      General Subsystem Interaction.. 2

3      Major System Components.. 2

3.1        Main Application Driver 2

3.1.1     Main Driver 2

3.2        Main Graphical Interface. 3

3.3        Application Workspace. 14

3.3.1     WorkSpace. 14

3.3.2     FileManager 18

3.4        Data Importing. 19

3.4.1     ImportWizardUI 19

3.4.2     Import 20

3.5        Database Handling. 22

3.5.1     Database System plan. 22

3.5.2     DBDriver Class. 23

3.6        Image Editing. 24

3.6.1     ImageEditor 24

3.7        Printing. 25

3.7.1     PrintJob. 25

3.7.2     PageLayout 27

3.7.3     PrintSize. 27

3.7.4     PrintSystemInterface. 28

3.7.5     AwtPrintSystem.. 29

3.8        CD Burning. 32

3.8.1     CDBurner 32

3.8.2     CDRecordHandler 33

3.8.3     ISO Maker 34

3.8.4     CDDevice. 34

3.9        Utility Classes. 35

3.9.1     Configuration. 35

3.9.2     PhotoAlbum.. 36

3.9.3     StorablePhoto. 37

3.9.4     ViewablePhoto. 38

4      Development Schedules.. 40

4.1        System Implementation. 40

4.2        Planned feature addition. 40

5      Glossary.. 42

 


Figures and Screenshots Index

Figure 1: Subsystem Interaction. 2

Figure 2: MainInterface Class Dependency Diagram.. 3

Figure 3: Main User Interface. 5

Figure 4: Icon palette. 6

Figure 5: File menu. 7

Figure 6: Edit menu. 9

Figure 7: Tools menu. 11

Figure 8: Help menu. 12

Figure 9: Database-specific interactions. 22

 


1         Introduction

1.1      Purpose

This document is a full design for the SwingPix photo organization system.  This document will present a full subsystem-oriented outline of the SwingPix software system.  Each subsystem will then be described in adequate detail to implement a working system.  As such, this document will provide the basis for the implementation of the system by the SwingPix development team.

1.2      Audience

This document will be a highly detailed description of the SwingPix photo organization system.  This document will be used by any developers implementing the SwingPix system.  Additional intended audiences include those who are interested in learning about the inner workings of the SwingPix photo organization system who also have some knowledge of the workings of computer software applications.  This document is not intended to give a simple overview of the proposed software system, please use the requirements document for any non-technical information on the system.

1.3      References

The SwingPix Requirements Specification document will provide additional non-technical information about this system.

 

1.4      Document Overview

This document will begin with a general overview of the system, going over the individual components in little detail.  Following the overview, there will be more detailed explanations of the classes that make up each of the system components.  The document will conclude with a general development schedule and the current list of future development items. 

 


2         General Subsystem Interaction

The SwingPix photo organization application will be divided into seven subsystems.  Each of which will be described in detail in the following pages of this document.  These subsystems are as follows:


n        Main Driver

n        Main GUI

n        Application Workspace

n        Database System

n        Image Editing System

n        Printing System

n        CD Writing System


 

The following diagram has been provided to detail the interaction between these systems.  The arrows are to indicate interactions between subsystems.  This interaction will either be in the form of data communications, or functional communications, depending on the process being carried out.  The systems surrounded by a double border will have graphics interface components.  Most of the components will communicate with both the Main GUI and the Workspace systems, so for the sake of simplicity, a unifying box has been drawn around the Main GUI and Workspace.  Any system connected to the unifying box will communicate with both the Main GUI and Workspace systems.

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Figure 1: Subsystem Interaction

 

3         Major System Components

The following tables detail individual system components.  Each table will define some type of system component (usually an object class).  The table headings are as follows:

o        Identification – an identifying name for the component

o        Type – the type of component being detailed

o        Function – the high level role of the component in the system

o        Subordinates – components that are used by the component being detailed

o        Dependencies – components that the component being detailed builds on

o        Interface – the methods of interaction with the component (e.g., member functions of a class)

o        Processing – the general operating procedures of the component

o        Data – the data that will be contained in the component

 

3.1      Main Application Driver

3.1.1      Main Driver

Identification

Main Driver (name: swingpix.run.SwingPix)

Type

Class

Function

The Main Driver class will run basic configuration functions, then invoke the Main Graphical Interface.

Subordinates

none

Dependencies

The Main Driver operates with the Configuration system and the Main GUI.

Interface

The Main Driver will be main class for this program; as such it does not have any methods of its own other than a main function to be invoked upon the program’s execution.

Processing

The Main Driver first calls upon the Configuration system to initialize system-specific data, then instantiates the Main Graphical Interface.

Data

None.

 

3.2      Main Graphical Interface

Figure 2: MainInterface Class Dependency Diagram

Identification

MainInterface

Type

Class

Purpose

MainInterface acts as a controller for each subsystem in SwingPix. 

Function

The main function of this class is to handle the events triggered by the user and translate these events to specific subsystem requests.

Subordinates

MainInterface will contain and manipulate instances of each of the following classes;

  • ImportWizard
  • Workspace
  • PrintSystemInterface
  • ImageEditor
  • CDBurner
  • Search

 

Frames;

·         ImportWizardGUI

·         PrintWizardGUI

·         EditGUI

·         CDBurnerGUI

·         SearchGUI

 

Dependencies

None

 

 

 

 

 

 

 

 

 

 

 

Processing

The main method of this class will start the application. When the application is started, the MainGUI will be loaded which is also the User Interface. This will also initialize the workspace (WorkSpace class). Each subsystem is called from MainGUI class by an actionperformed method. For instance, in order to launch the import wizard, the user has to either select “Import” from the File Menu or select the “Import Wizard” icon from the icon palette. The same actionperformed method is used to load each of theses instances. Here is an example of what the actionperformed method will look like for the import wizard;

 

void import_actionPerformed(ActionEvent evt) {

    ImportWizard importWizard = new ImportWizard(); //Here the                            

}//class is being instantiated                                                                             

 

The above method is then called while adding an actionListener to the import object. Here is an example of what the actionListener will look like;

 

import.addActionListener(new ActionListener(){

    void import_actionPerformed(ActionEvent evt) {

    ImportWizard importWizard = new ImportWizard();

  }

});

 

Subsytems

The internal structure of the main system (MainGUI) and how each component interacts with one another as specified in the functional requirements.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Interfaces

Figure 3: Main User Interface

 

Figure 4: Icon palette

 

Main Screen

·         The main screen will have three panes as displayed above. One consisting of the album tree, the second one consisting of thumbnails of the picture(s) that exist in an album, and the last pane consisting of icons. Initially, there will be a default album and picture(s) as displayed in Figure 1.0, the first time a user launches the application. When the user selects an album from the album tree, the thumbnails of the picture(s) that exist in the album will be displayed in the thumbnail pane as you can see in the Figure 1.0.

 

·         The “Create New Album” button when clicked will load the ImportWizard class that will launch the ImportWizardGUI where the user can either create a new album and import picture(s) to it or import picture(s) to an existing album. The following method will be called in MainGUI class;

 

void importWizard_actionPerformed(ActionEvent evt) {

    ImportWizard importWizard = new ImportWizard();

}

 

 

·         The “Previous Album” button when clicked, acts as a navigation tool for the user to view previous picture(s) that exist in the previous album(s) up the album tree hierarchy, if any exists.

 

·         The “Next Album” button when clicked, also acts as a navigation tool for the user to view other picture(s) in album(s) that exist down the album tree hierarchy, if any exits.

 

·         The “Print, Rotate, Write to CD, Save for Email, and Import Picture(s)” icons, are displayed at the bottom pane for quick access. When the user double clicks on any of these icons, a method is called and a new window or dialog is displayed that pertains to that icon’s class.

Note: It’s the same method that is used to handle the actionPerformed when the user selects a quick access icon from the icon palette or a menu item from the file and tools menu.

 

     

Figure 5: File menu

 

·         Under the “File” menu will exist the following menu items; Open, Import, Save album, Save for email, Close, Print, and Write to CD, as shown in figure 1.2. When any of these menu items is selected, a method is called that will load a class which will then launch a dialog or window pertaining to the menu item selected. Look at figure 1.7 for the menu items and their methods. The “Close” menu item will allow the user to exit the system.

 

Open

 When open is selected, a method is called that will launch a file dialog which will        enable the user to select a picture or image to be viewed from a specified directory or device. Hee is an example of what the method will look like;

 

    void open_actionPerformed() {

        FileDialog fileDialog = new FileDialog();

    }

 

Import

When import is oselected, ImportWizard class will be loaded which will extend               ImportWizardGUI that will launch the import wizard. Here the user can import picture(s) into an existing album or create a new album to import picture(s) to. Here is an example of that the ImportWizard class will look like;

 

         public class ImportWizard extends ImportWizardGUI {

         }

     

Save album and Save for email

When either of these menu items is selected, a method will be called that will allow the user to save the album or picture for email in the save album or save for email directories under the workspace directory.

 

Print

When print is selelcted, PrintWizard class will be loaded which will extend PrintWizardGUI that will launch the print wizard. Here the user can select picture(s) to be printed and the sizes the picture(s) should be printed as. Here is an example of what the PrintWizard class will look like;

 

   public class PrintWizard extends PrintWizardGUI {

  }

 

Write to cd

When print is selelcted, CDBurner class will be loaded which will extend CDBurnerGUI that will launch the cd burning wizard. Here the user can select picture(s) and/or album(s) to be burned unto a cd. Here is an example of what the CDBurner class will look like;

 

   public class CDBurner extends CDBurnerGUI {

  }

 

Close

When close is selected, a method is called that will exit the system. To find out what the method will look like, go to figure 1.7.

 

 

Figure 6: Edit menu

 

·         Under the “Edit” menu will exist the following menu items; Delete, and Rename,  as shown in figure 1.4. When any of these menu items is selected, a method is called that will load a class which will then launch a dialog or window pertaining to the menu item selected. Look at figure 1.7 for the menu items and their methods.

 

Delete

When delete is selected a method will be called that will allow the user to delete   album(s) or picture(s). Look at figure 1.7 for what the method will look like.

 

Rename

When rename is selected, a method is called that will allow the user to rename an                     album or picture. Look at figure 1.7 for what the method will look like.

 

Figure 7: Tools menu

 

·         Under the “Tools” menu will exist the following menu items; Rotate, Crop, Zoom in (+), Zoom out (-), Next album (Page Down), and Previous Album (Page Up) , as shown in figure 1.5. When any of these menu items is selected, a method is called that will load a class which will then launch a dialog or window pertaining to the menu item selected. Each of this menu items will be handled by methods in the Edit class.

 

     

Figure 8: Help menu

 

·         Under the “Help!” menu will exist the following menu items; About, Search, and Help with…, as shown in figure 1.6. When any of these menu items is selected, a method is called that will load a class which will then launch a dialog or window pertaining to the menu item selected. Look at figure 1.7 for the menu items and their methods.

 

About

When selected, will display a small dialog that will tell the user what version of the system he/she is using, an overview of the system, and copyright laws.

 

Help with...

When selected, will load call a method This will then load the HelpWith window. This is where a user’s question can be answered concerning the system.

 

Search

When selected, will load the Search class which extends SearchGUI that will launch the search window. The user can search for an album or picture by name. If the album(s) or picture(s) exist, they will be displayed in a list, and if not, a message will be displayed telling the user to either check the search string entered, or enter a new search string. Look at figure 1.7 for what the method will look like.

 

·         Here are the following methods called when any of the menu items is selected;

 

 

Menu item

Method

Import

void importWizard_actionPerformed(ActionEvent evt)

{

    ImportWizard importWizard = new ImportWizard();

}

 

Open

void open_actionPerformed(ActionEvent evt)

 

Save

void save_actionPerformed(ActionEvent evt)

Save for email

void saveForEmail_actionPerformed(ActionEvent evt)

Print

void printWizard_actionPerformed(ActionEvent evt)

    PrintWizard printWizard = new PrintWizard();

}

 

Write to CD

 

void writeToCd_actionPerformed(ActionEvent evt)

 {

    WriteToCd writeToCd = new WriteToCd();

}

Close

private void exitForm(WindowEvent evt) {

        System.exit(0);

           }

Rename

void renamePhoto( Photo photo, String name)

void renameAlbum(PhotoAlbum album String name)

Delete

void deleteAlbum(PhotoAlbum album)

void deletePhoto(Photo photo, PhotoAlbum album)

About

void about(JDialog dialog, JLabel label)

Search

void searchAlbum(String album)

void searchPhoto(String photo)

HelpWith

void helpWith(String word)

Data

This class is static and therefore no instance of it shall be created.

 

3.3      Application Workspace

3.3.1      WorkSpace

Identification

WorkSpace

Type

Class

Function

The WorkSpace is a management tool.  Its purpose is to manage albums and their contents while keeping the filesystem and database up-to-date.  It will communicate with DBDriver for data updates and retrieval.  It will also need to handle any and all errors when performing its operations.

Subordinates

none

Dependencies

Communicates with MainGUI, DBDriver, FileManager, AppDriver, Editing, cd burning and import wizard classes.

Interfaces

void initialize()

PhotoAlbum createAlbum(String name)

vector getAllAlbums()

Photo getPhoto()

PhotoAlbum getAlbum()

void addPhoto(Photo photo, PhotoAlbum album)

void copyPhoto(Photo photo, PhotoAlbum sourceAlbum, PhotoAlbum destAlbum)

void movePhoto(Photo photo, PhotoAlbum sourceAlbum, PhotoAlbum destAlbum)

void renamePhoto(Photo photo, String name)

void renameAlbum(PhotoAlbum album, String name)

void deletePhoto(Photo photo, PhotoAlbum album)

void deleteAlbum(PhotoAlbum album)

void savePhoto(Photo photo)

Processing

void initialize()

As soon as WorkSpace is created it will need to begin the initialization process.  This includes creating the database container and using it to access the database.  Album objects will also be created at this time.

 

PhotoAlbum createAlbum(String name)

Tell DBDriver to create new album.  Create an instance of the new album.  Call on FileManager to create a folder for the new album on the hard disk.  Handle disk write and DBDriver exceptions.

 

vector getAllAlbums()

Get list of albums from DB.  Make a call to getAlbum() for each album in list.  Handle disk read and DBDriver exceptions.

 

PhotoAlbum getAlbum()

Make a call to getPhoto() for each image in the album.

 

Photo getPhoto()

Call readImage method in FileManager class.  Construct a new Photo object with the Graphic2d that is returned.  Handle disk read exceptions.

 

void addPhoto(Photo photo, PhotoAlbum album)

Call on DBDriver to create this image in the database.  Call writeImage function in FileManager class.  Handle disk write or DBDriver exceptions.

 

void copyPhoto(Photo photo, PhotoAlbum sourceAlbum, PhotoAlbum destAlbum)

Call writeImage function in FileManager class to write the copied image to the new location.  Make update call to DBDriver.  Update the PhotoAlbum objects.  Handle disk write and DBDriver exceptions.

 

void movePhoto(Photo photo, PhotoAlbum sourceAlbum, PhotoAlbum destAlbum)

Call deleteImage in FileManager class to remove the image from the source album.  Call writeImage in FileManager class to write the image to the destination album.  Make update call to DBDriver.  Update the PhotoAlbum objects.  Handle disk write and DBDriver exceptions.

 

void renamePhoto(Photo photo, String name)

Make update call to DBDriver.  Handle DBDriver exception.

 

void renameAlbum(PhotoAlbum album, String name)

Make update call to DBDriver.  Handle DBDriver exception.

 

void deleteAlbum(PhotoAlbum album)

Call on DBDriver to delete the album from the database.  Call deleteAlbum in FileManager class to remove it from the hard disk.  Handle disk write and DBDriver exceptions.

 

void deletePhoto(Photo photo, PhotoAlbum album)

Call on DBDriver to delete the image from the database.  Call deleteImage in FileManager class to remove it from the hard disk Handle disk write and DBDriver exceptions.

 

void savePhoto(Photo photo)

Call writeImage in FileManager class to write the new version of the image to the hard disk.  Handle disk write exception.

Data

private DBDriver dbDriver

 

3.3.2      FileManager

Identification

FileManager

Type

Static Class

Function

The FileManager class is a static class and will be responsible for maintaining the Swingpix directory structure on the hard disk.  It will write image files to the disk as well as read images from the hard disk or a cd.

Subordinates

none

Dependencies

The FileManager can only be referenced by the WorkSpace class.

Interfaces

void createAlbum(String folderName)

Graphics2d readImage(String path, String filename)

void writeImage(Graphics2d image, String path, String filename)

void deleteImage(String path, String filename)

void deleteAlbum(String folderName)

Processing

void createAlbum(String folderName)

This method will create a folder for the new album.

 

Graphics2d readImage(String path, String filename)

This method will read an image file from the disk and store it in the Photo object that will be returned.

 

void writeImage(Graphics2d image, String path, String filename)

This method will write the given image to disk.

 

void deleteImage(String path, String filename)

This method will delete the given image from the given album’s folder.

 

void deleteAlbum(String folderName)

This method will delete the given folder and all its contents.

 

 

Resources

Filesystem

The filesystem will be organized as follows:

 

  • Each album will have a folder
  • Each album folder will have one subdirectory for each of the following: images, thumbnails, and original images. 
  • Each image belonging to an album will be stored in the appropriate album’s images folder

 

The directory structure will look like this:

 

-Swingpix (Base directory)

   -Data

      -Album (each album will have a folder at this level)

         -Images

         -Thumbnails

         -Backup

 

3.4      Data Importing

3.4.1      ImportWizardUI

Identification

ImportWizardGUI

Type

Class

Function

This class provides a graphical interface that allows the user to import pictures to a new or existing album.  Images can be added or removed from the working album while working with the wizard.

Subordinates

none

Dependencies

none

Interfaces

void onAddImages(Vector photoCollection)

void onAddImage(Photo photo)

void onRemoveImage(Photo photo)

void onCreateNewAlbum()

void onOpenExistingAlbum()

Processing

void onAddImages()

Calls on import object to add the selected photos to the album.

 

void onAddImage()

Calls on import object to add the selected image to the import

 

void onRemoveImage()

This method calls on the import object to remove the selected image from the import.

 

void onCreateNewAlbum()

This method calls on the import object to create a new album to import images to.

 

void onOpenExistingAlbum()

This method calls on the import object to retrieve an existing album from the WorkSpace to import images to.

 

void onPerformImport()

 

Data

Import import

 

3.4.2      Import

Identification

Import

Type

Class

Function

This class provides a data type to store all relevant information about an import.  This information includes the images to be added.

Subordinates

none

Dependencies

none

Interfaces

void addImages(Vector photoCollection)

void addImage(Photo photo)

void removeImage(Photo photo)

void createNewAlbum()

void openExistingAlbum( )

Processing

void addImages(Vector photoCollection)

Adds the collection of images to the import

 

void addImage(Photo photo)

Adds the image to the import

 

void removeImage(Photo photo)

Removes the image from the import

 

void createNewAlbum()

This method has the WorkSpace create a new album that images will be imported into.

 

void openExistingAlbum(

Gets an existing album from the WorkSpace to import images to.

 

void performImport()

This method will ask the WorkSpace to add all the selected images to the album that was chosen during the import process.

Data

private Vector imageCollection

private Album importAlbum

 

3.5      Database Handling

3.5.1      Database System plan

Figure 9: Database-specific interactions

 

For our purposes we are using JDBM 0.12, an open source database available through http://jdbm.sourceforge.net. JDBM is a simple transactional persistent engine for Java. It aims to be for Java what GDBM is for C/C++, Perl, Python, etc: a fast, simple persistence engine. All the API’s are available on the website.

 

3.5.2      DBDriver Class

Identification

DBDriver

Type

Class

Function

This class will act as a communication portal between the Database and the other subsystems. The DBDriver will handle all the requests made to the database by the other subsystems and will use the build-in functions of the database to give appropriate output. The DBDriver will have to create methods to handle each request.

Subordinates

none

Dependencies

This module is responsible for orchestrating data accuracy within the program, as it will be responsible for dealing directly with the database.

It will rely on the accuracy of its methods and the format of the request heavily to perform its task.  In order for the DBDriver to run, all the JDBM API files must be available. The module will completely depend on the hardware and software being used by the system, the operating system being either Windows or Linux.

Interface

The DBDriver is the interface of the database. The DBDriver wouldn’t need a graphical interface of its own, as the subsystems will know how to invoke the methods of the DBDriver.

This class will create the following methods:

createTable( ) – Creates a new table

deleteTable( ) – Deletes an existing table

insertRecord( ) – Insert a new record into an existing table.

deleteRecord( ) – Delete existing record/records

updateRecord( ) – Update changes to a record.

findRecord( ) - Search for a record within the database.

Processing

  1. The Subsystems will request information using their defined methods.
  2. The DBDriver will take the request and figure out what the subsystem requests of the database.
  3. The DBDriver then uses its methods to get the requested information from the database using the appropriate query.
  4. The database acts on the requested query and gives an output accordingly.
  5. The DB will get the output provided by the database, arrange it and present it to the subsystem in the way they requested it.

Data

The data being handled will be metadata, mostly information about the images in terms of its size, the album it’s being stored in and the path to the image location.

 

3.6      Image Editing

3.6.1      ImageEditor

Identification

ImageEditor

Type

Class

Function

This class will provide static methods for operating on BufferedImages.  All of the functions contained in this class will operate on and return BufferedImage objects, as such, the first argument of every function is a BufferedImage.

Subordinates

None.

Dependencies

None.

Interfaces

toBlackandWhite(…)

setColors(…, double, double, double)

zoom(…, double)

copy(…)

scale(…, double[, double[, int]])

resize(…, double, double)

rotate(…, double) [also rotateCW, rotateCCW]

flip[Horizontal/Vertical]

createThumbnail(…)

constrain(…, Dimension, boolean)

Processing

toBlackandWhite()- this function is a convenience function for setColors(…, 0, 0, -1)

setColors()- adjusts the brightness, contrast, and saturation of an image respectively.  All parameters are ranged [-1,1]

zoom()- convenience function for fast scaling

copy()- creates a new BufferedImage from the provided image.

scale()-  scale an image in one or both directions, with an int parameter to specify the type of scaling.

resize()- resizes an image to a particular pixel or percentage proportion

rotate()- rotates an image by the specified number of degrees, or 90 degrees clockwise/counterclockwise.

flip[Horizontal/Vertical]- flips the image in a mirror fashion either vertically or horizontally.

createThumbnail()- creates a thumbnail sized image from the provided image.

constrain(…, Dimension, boolean)- constrains an image to specific proportions without changing the image aspect ratio, the boolean specifies whether the image should be scaled up to the proportions or not.

Data

None.  All image data is passed into functions and immediately passed back out.

 

3.7      Printing

3.7.1      PrintJob

Identification

PrintJob

Type

Class

Function

This class provides a data type to store all relevant information about a print job.  This information includes the photos to be printed, the size of each photo, and the page layout.  This class is what is expected by all implementing classes of the PrintSystemInterface in order to properly print.

Subordinates

none

Dependencies

none

Interfaces

void addPhotos(Vector photoCollection)

void addPhoto(Photo photo)

void removePhoto(Photo photo)

void setLayout(PageLayout layout)

PageLayout getLayout()

void setPrintSize(PrintSize size)

PrintSize getPrintSize()

Processing

void addPhotos(Vector photoCollection)

Adds the photoCollection to the PrintJob

 

void addPhoto(Photo photo)

Adds the photo to the PrintJob

 

void removePhoto(Photo photo)

Removes the photo from the PrintJob

 

void setLayout(PageLayout layout)

Sets the layout of the PrintJob to layout (see PageLayout).

 

PageLayout getLayout()

Returns a reference to the current PageLayout (see PageLayout).

 

void setPrintSize(PrintSize size)

Sets the PrintSize to size (see PrintSize).

 

PrintSize getPrintSize()

Returns a reference to the current PrintSize (see PrintSize).

Data

private ArrayList photos

Collection of StorablePhotos to be printed

 

private PageLayout layout

PageLayout used to print the photos

 

private PrintSize size

PrintSize to be used

 

3.7.2      PageLayout

Identification

PageLayout

Type

Class

Function

This class provides a simple abstraction of the two page layout choices: “Pretty Print” and “Maximum Output”.  Pretty Printing ensures that all photos on each printed page face the same direction are centered horizontally on the page, contain captions indicating their user-given photo names, and that photos are separated vertically by at least ˝ inch.  Maximum Output printing indicates that any measures may be taken to place photos on each page to maximize the number of photos per sheet of printed paper as long as the print size is retained and that all photos are separated by at least Ľ inch.

Subordinates

none

Dependencies

none

Interfaces

void setLayout(final int layout)

final int getLayout()

Processing

void setLayout(final int layout)

This method takes one of the final int data members of PageLayout to set the layout field appropriately (see Data section).

 

final int getLayout()

Returns the current layout data field.

Data

public static final int PRETTY_PRINT = 0

public static final int MAX_FIT = 1;

private static final int NUM_LAYOUTS = 2;

The total number or available layouts – used for error checking

 

3.7.3      PrintSize

Identification

PrintSize

Type

Class

Function

This class provides a simple abstraction to the variety of printable photo sizes available (any of the supported standard photo sizes or other options – see Data section).  Each option is characterized by a final int data member of the PrintSize class.

Subordinates

none

Dependencies

none

Interfaces

void setSize(final int size)

int getSize()

Processing

void setSize(final int size)

Set the photo size of the current instance to size.

 

int getSize()

Return the current print size int.

Data

int printSize

private static final int 3_BY_5 = 0

   3”x5” standard photo size

private static final int 4_BY_6 = 1

   4”x6” standard photo size

private static final int 5_BY_7 = 2

   5”x7” standard photo size

private static final int 8_BY_10 = 3

   8”x10” standard photo size

private static final int FREE_SIZE = 4

   Print the photo by it’s current size

private static final int MAX_SIZE

   Maximize the photo to fit on a single sheet while still retaining its aspect ratio (i.e. shape).

 

3.7.4      PrintSystemInterface

Identification

PrintSystemInterface

Type

Interface

Function

This interface provides the minimum requirements that an implementation should support.  Basically, any print system implementation should support the print(PrintJob job) method, no matter what API it uses to accomplish the task of turning the PrintJob into dead trees.

Subordinates

none

Dependencies

none

Interfaces

void print(PrintJob job, int resolution) throws PrintException

Processing

void print(PrintJob job) throws PrintException

This method should use whatever means necessary to convert the PrintJob from bits and bytes into sheets of paper with the photos of the job laid out exactly as specified in the job.  In case of a printing error, a PrintException should be thrown with a message indicating the nature of the error.

Data

 

 

3.7.5      AwtPrintSystem

Identification

AwtPrintSystem

Type

Class

Function

This class implements the PrintSystemInterface using the AWT printing API.  Currently, this is the API we expect to use for all of SwingPix’s  printing needs, but just in case, we made sure to first create the PrintSystemInterface so that we may change our minds without drastically changing our code.

Subordinates

none

Dependencies

AWT Printing API

Interfaces

void print(PrintJob job, int resolution) throws PrintException

Processing

public AwtPrintSystem(Frame frame, Workspace workspace)

Constructor

 

void print(PrintJob job, int resolution) throws PrintException

This method employs the Java2D API to print the job to paper as described specifically by the job’s PageLayout and PrintSize.

 

private int layoutPage(

                        ArrayList allPhotos,

                        int index,

                        PrintJob job,

                        Dimension pageSize,

                        Graphics page)

Method for laying out the next page in the document – makes a call to either layoutPagePretty() or layoutPageSqueezed() depending on the PageLayout of the PrintJob.

   allPhotos – all StorablePhotos to be printed

   index – index into allPhotos of the next photo to be laid out

   job – the PrintJob being printed

   pageSize – the printable area of the page

   page – the current page to be drawn to

Returns the number of photos laid out onto page.

 

private int layoutPagePretty(

                        ArrayList allphotos,

                        int index,

                        PrintJob job,

                        Dimension pageSize,

                        Graphics page)

This method follows the “Pretty Print” guidelines for laying out photos onto the current page.

   allPhotos – all StorablePhotos to be printed

   index – index into allPhotos of the next photo to be laid out

   job – the PrintJob being printed

   pageSize – the printable area of the page

   page – the current page to be drawn to

Returns the number of photos laid out onto the page.

 

private int layoutPageSqueezed(

                        ArrayList allphotos,

                        int index,

                        PrintJob job,

                        Dimension pageSize,

                        Graphics page)

~NOT IMPLEMENTED~ This method follows the “Max Output” method of laying out photos onto the current page.

   allPhotos – all StorablePhotos to be printed

   index – index into allPhotos of the next photo to be laid out

   job – the PrintJob being printed

   pageSize – the printable area of the page

   page – the current page to be drawn to

Returns the number of photos laid out onto the page.

 

private BufferedImage resizePhoto(

                        BufferedImage photo,

                        PrintSize printSize,

                        Dimension pageSize)

This method will resize the photo (if necessary) to match the printSize while still retaining the photo’s aspect ratio (shape) AND not allowing the photo to be larger than the page. 

   Please note that in the case of the standard photo PrintSizes, the original photo may not be the same aspect ration as the requested output size.  In such cases, resizing will occur such that the largest dimension of the output image will be exactly the largest dimension of the desired size AND the smallest dimension of the output image will be greater than or equal to the smallest dimension of the desired size but less than or equal to the largest dimension of the requested size.  In simpler terms, either the output will be exactly the requested dimensions or only one dimension (length or width) will need to be trimmed (by cutting manually) in order to make the printed output into the standard photo size.  The motivation for this method is to allow the user to chop off whatever parts of the image they find most suitable – rather than programmatically doing it or distorting the image’s original shape.

   photo – photo to be resized

   printSize – desired output size

   pageSize – printable area of the page.

 

private BufferedImage getBufferedImage(StorablePhoto currentPhoto)

This method uses the workspace to return the BufferedImage which corresponds to the currentPhoto’s full sized image.

Data

private static int printerResolution

Resolution in dots per inch (dpi) to print at

 

private static final PageAttributes.PrintQualityType PRINT_QUALITY

One of the three available print quality in the AWT system

 

private Frame parentFrame

Frame to which the AWT print dialog belongs

 

private final Workspace workspace

Workspace used to convert StorablePhotos to BufferedImages

 

private BufferedImage cachedPhoto

When implementing the Pretty Print layout, it became necessary to look ahead to the next photo, which requires loading it into memory.  In the case that this photo cannot fit on the current page, it is cached here so that it does not need to be retrieved again when laying out the next page – pretty slick, eh?

 

3.8      CD Burning

3.8.1      CDBurner

Identification

CDBurner

Type

Class

Function

This is the main class for handling CD burning.  Any CD burning process will start by instantiating an object of this class.  This class will have the functions necessary to specify what data is to be burned, and how.

Subordinates

CDRecordHandler, ISOMaker

Dependencies

None

Interfaces

void setFiles(Vector filelist) throws FileException

void setMode(int burnmode) throws InputException

Vector getDevices()

CDDevice getFirstDevice()

void setDevice(CDDevice dev) throws IOException

void burn() throws BurnException

Processing

construction – CDBurner must be given a reference to the program’s Workspace object

setFiles(Vector filelist) – will define the set of files (or directories) to be burned to the CD

setMode(int burnmode) – takes one of CDBurner.COPY or CDBurner.ARCHIVE and uses it to define what type of disc to write

getDevices() – returns a vector of CDDevice objects, each referencing a particular possible CD burning device.

getFirstDevice() – returns the first device reported by the CDRecordHandler

setDevice(CDDevice dev) – sets the device to write to as specified by dev

burn() – tells the CDBurner to begin the burn process

Data

The CDBurner object keeps internal copies of the data passed to it.

 

3.8.2      CDRecordHandler

Identification

CDRecordHandler

Type

Class

Function

This class is an abstraction for ‘cdrecord’, the program used to interact with the CD recording hardware.

Subordinates

None

Dependencies

presence of ‘cdrecord’ in the system (where it is expected to be found)

Interfaces

Vector getDevices()

void writeDisc(CDDevice dev, String isofilename) throws IOException

Processing

getDevices() – returns a vector of CDDevice objects, each referencing a particular possible CD burning device.

writeDisc(…) – starts the burning process for the selected ISO using the specified writing device

Data

None

 

3.8.3      ISO Maker

Identification

ISOMaker

Type

Class

Function

This class is an abstraction for ‘mkisofs’, the program used to build the ISO files used to make CDs

Subordinates

None

Dependencies

presence of ‘mkisofs’ on the system (where it is expected to be found)

Interfaces

void setFiles(Vector filelist) throws FileException

String getISOFilename()

Processing

setFiles(…) – returns a vector of CDDevice objects, each referencing a particular possible CD burning device.

getISOFilename()) – builds an ISO and returns the file name and path of the generated ISO.

Data

Holds a record of files to be included in the ISO.

Contains a hardcoded member dictating the ISO type as either Joliet (Romeo if necessary) or Rockridge

 

3.8.4      CDDevice

Identification

CDDevice

Type

Class

Function

This is a data class intended to represent a particular CD writing device.  It will contain all the data about the particular device.

Subordinates

None

Dependencies

None

Interfaces

int getLUNAdapter()

int getLUNHost()

int getLUNDev()

int getID()

String getLongName()

String getShortName()

String toString()

Processing

construction – specify LUN (comma separated string), Long name, and Short name

getLUNAdapter() – returns the adapter number of the device

getLUNHost() – returns the host number of the device

getLUNDev()  returns the device number of the device

getID() – returns the unique identifier for the device

getLongName() – returns the device name (with model info)

getShortName() – returns the short device name (for UI)

toString() – outputs LUN as a comma separated triplet

Data

Holds a record of specified LUN, long name, and short name

 

3.9      Utility Classes

These classes are common classes across every subsystem used for data storage and handling.

3.9.1      Configuration

Identification

Configuration

Type

Class

Function

This class holds static members and functions used to hold system configuration data.

Subordinates

None.

Dependencies

None.

Interfaces

public void setOS()

numerous public static data members

Processing

setOS()- sets public static data members that are operating-system dependent

static data members- these data members encompass various operational parameters for the system (e.g., JPEG compression, external program locations, thumbnail sizes, image formats).

Data

All data for this class is in the form of public static member variables.  They are provided by the class directly.  As such any instantiation of this class has no personal data.

 

3.9.2      PhotoAlbum

Identification

PhotoAlbum

Type

Class

Function

This class serves as data storage for a collection of StorablePhoto objects.

Subordinates

StorablePhoto

Dependencies

None.

Interfaces

addPhotoCollection(Collection)

addPhoto(StorablePhoto)

removePhoto(StorablePhoto)

setName(String)

getName(String)

getId()

size()

getPhoto(int)

search(String)

Processing

addPhotoCollection(Collection)- appends a java Collection of StorablePhoto objects to this album in the order that they are returned by the Collection’s iterator.

addPhoto(StorablePhoto)- adds a single StorablePhoto to this album.

removePhoto(StorablePhoto)- removes a specific StorablePhoto from this album.

setName(String)- sets the album name.

getName(String)- returns the album name.

getId()- returns the album’s ID.

size()- returns the number of StorablePhoto objects in the album.

getPhoto(int)- returns a specific StorablePhoto by index in the album

search(String)- searches for any StorablePhoto whose textual data matches the provided regular expression.

Data

photos- a collection of StorablePhotos in the album

name- the name of the photo album

id- the ID for this album

 

3.9.3      StorablePhoto

Identification

StorablePhoto

Type

Class

Function

This class represents all the non-graphical data associated with a photograph in the system.  This object is serializable (able to be represented by a string) so that it can be stored in the database.

Subordinates

None.

Dependencies

None.

Interfaces

setName(String)

getName()

setId(String)

getId()

getAlbumName()

Processing

setName(String)- sets the name for this photo

getName()- returns the name for this photo

setId(String)- sets the ID for this photo

getId()- returns the ID for this photo

getAlbumName()- returns the album name

Data

name- the name for this photo

id- the ID for this photo (unique within an album)

albumName- the parent album name for this photo

 

3.9.4      ViewablePhoto

Identification

ViewablePhoto

Type

Class

Function

This class is an encapsulation of StorablePhoto that also contains the graphical data associated with the StorablePhoto.  It is not serializable, because storing this class directly into the database would also put graphical information in the database.

Subordinates

StorablePhoto

Dependencies

None.

Interfaces

updateThumbnail()

getPhoto()

getThumbnail()

setStorableInfo(StorablePhoto)

getStorableInfo()

getAlbumName()

getPhotoID()

getName()

getDiskLocation()

Processing

updateThumbnail()- creates a new thumbnail image using the full sized image as a reference.

getPhoto()- returns the full sized BufferedImage.

getThumbnail()- returns the thumbnail BufferedImage.

setStorableInfo(StorablePhoto)- sets the StorablePhoto data for this object.

getStorableInfo()- returns the StorablePhoto data for this object.

getAlbumName()- returns the parent album name (taken from the internal StorablePhoto).

getPhotoID()- returns the ID of this photo (taken from internal StorablePhoto).

getName()- returns the name of this photo (taken from internal StorablePhoto).

getDiskLocation()- returns the location of the file from which this photo was created, on disk.

Data

photo- the full size image, as a BufferedImage object

thumbnail- the thumbnail-sized image, as a BufferedImage

storableInfo- the StorablePhoto from which this ViewablePhoto was created

diskLocation- the location of the file representing this photo, on disk

 


4         Development Schedules

4.1      System Implementation

  1. Build Photo class
  2. Build Album class
  3. Build DB class
    1. Implement data storage
    2. Implement data searching
  4. Test function and integration between Photo, Album, and DB classes
  5. Build Main GUI
  6. Build Main Driver
    1. Test function and integration between completed components
  7. Build Workspace
  8. Build Importing System
  9. Test partially completed system for integration and photo management capabilities
  10. Build Editing System
  11. Test Editing System
  12. Build Printing System
  13. Test Printing System
  14. Build CD Burning System
  15. Test CD Burning System
  16. Test whole system for completeness and reliability

  17. Build installation guide program
  18. Test software package as a whole until package is prepared for initial release

 

4.2      Planned feature addition

The SwingPix photo system will be complete for basic use upon initial release.  However, there are a number of features that have been discussed for possible release.  These features will not be available until subsequent releases.  These features may include the following possibilities, as well as any features that may be suggested during the course of user testing.

n        Rendering albums to HTML for sharing purposes

n        Uploading rendered HTML pages to user web space

n        Automatic photograph enhancement

n        Direct importing from devices that use TWAIN style interfaces

n        Album encryption and keyed access


5         Glossary

TWAIN:                 [Technology Without An Interesting Name] A common protocol used for communications with advanced graphic devices such as scanners and digital cameras.

 

ISO:                       [International Organization for Standardization] When used as a noun, this acronym refers to a disk image adhering to the ISO9660 standard.

 

disk image:          The contents of an entire storage device’s data represented as a single file.  This file can be used to reproduce copies of a data storage device’s contents, in their entirety.

 

ISO9660:               A standardized data file format commonly used on CD-ROMs.

 

Joliet:                   A Microsoft file system designed to be encapsulated into an ISO9660 image.  This file system has support for long file names, and is compatible with the DOS 8.3 file naming convention.

 

Romeo:                 An extended Joliet file system.  This file system can handle longer file names than Joliet, but is not compatible with the DOS 8.3 file naming convention.

 

Rockridge:           An open file system designed to be encapsulated into an ISO9660 image.  This file system conforms to the extended file system standard, commonly used on Linux systems.

 

LUN:                     [Logical Unit Number] A numeric triplet (e.g., 0, 6, 0) used to identify devices on a SCSI device adapter.

 

SCSI:                    [Small Computer System Interface] An interface to mass storage devices commonly used for high-bandwidth data transfers.  All recordable CD devices operate over either hardware or software SCSI channels.