import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.LineNumberReader;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.StringTokenizer;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.CoolBarManager;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.StatusLineManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.operation.ModalContext;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
/**
* This class keeps track of you library, and who you've loaned books to
*/
public class Librarian extends ApplicationWindow {
// A static instance to the running application
private static Librarian APP;
// Table column names/properties
public static final String TITLE = "Title";
public static final String CHECKED_OUT = "?";
public static final String WHO = "By Whom";
public static final String[] PROPS = { TITLE, CHECKED_OUT, WHO };
// The viewer
private TableViewer viewer;
// The current library
private Library library;
// The actions
private NewAction newAction;
private OpenAction openAction;
private SaveAction saveAction;
private SaveAsAction saveAsAction;
private ExitAction exitAction;
private AddBookAction addBookAction;
private RemoveBookAction removeBookAction;
private AboutAction aboutAction;
private ShowBookCountAction showBookCountAction;
/**
* Gets the running application
*/
public static final Librarian getApp() {
return APP;
}
/**
* Librarian constructor
*/
public Librarian() {
super(null);
APP = this;
// Create the data model
library = new Library();
// Create the actions
newAction = new NewAction();
openAction = new OpenAction();
saveAction = new SaveAction();
saveAsAction = new SaveAsAction();
exitAction = new ExitAction();
addBookAction = new AddBookAction();
removeBookAction = new RemoveBookAction();
aboutAction = new AboutAction();
showBookCountAction = new ShowBookCountAction();
addMenuBar();
addCoolBar(SWT.NONE);
addStatusLine();
}
/**
* Runs the application
*/
public void run() {
// Don't return from open() until window closes
setBlockOnOpen(true);
// Open the main window
open();
// Dispose the display
Display.getCurrent().dispose();
}
/**
* Configures the shell
*
* @param shell
* the shell
*/
protected void configureShell(Shell shell) {
super.configureShell(shell);
// Set the title bar text
shell.setText("Librarian");
}
/**
* Creates the main window's contents
*
* @param parent
* the main window
* @return Control
*/
protected Control createContents(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout(1, false));
viewer = new TableViewer(composite, SWT.FULL_SELECTION | SWT.BORDER);
Table table = viewer.getTable();
table.setLayoutData(new GridData(GridData.FILL_BOTH));
// Set up the viewer
viewer.setContentProvider(new LibraryContentProvider());
viewer.setLabelProvider(new LibraryLabelProvider());
viewer.setInput(library);
viewer.setColumnProperties(PROPS);
viewer.setCellEditors(new CellEditor[] { new TextCellEditor(table),
new CheckboxCellEditor(table), new TextCellEditor(table) });
viewer.setCellModifier(new LibraryCellModifier());
// Set up the table
for (int i = 0, n = PROPS.length; i < n; i++)
new TableColumn(table, SWT.LEFT).setText(PROPS[i]);
table.setHeaderVisible(true);
table.setLinesVisible(true);
// Add code to hide or display the book count based on the action
showBookCountAction
.addPropertyChangeListener(new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
// The value has changed; refresh the view
refreshView();
}
});
// Rfresh the view to get the columns right-sized
refreshView();
return composite;
}
/**
* Creates the menu for the application
*
* @return MenuManager
*/
protected MenuManager createMenuManager() {
// Create the main menu
MenuManager mm = new MenuManager();
// Create the File menu
MenuManager fileMenu = new MenuManager("File");
mm.add(fileMenu);
// Add the actions to the File menu
fileMenu.add(newAction);
fileMenu.add(openAction);
fileMenu.add(saveAction);
fileMenu.add(saveAsAction);
fileMenu.add(new Separator());
fileMenu.add(exitAction);
// Create the Book menu
MenuManager bookMenu = new MenuManager("Book");
mm.add(bookMenu);
// Add the actions to the Book menu
bookMenu.add(addBookAction);
bookMenu.add(removeBookAction);
// Create the View menu
MenuManager viewMenu = new MenuManager("View");
mm.add(viewMenu);
// Add the actions to the View menu
viewMenu.add(showBookCountAction);
// Create the Help menu
MenuManager helpMenu = new MenuManager("Help");
mm.add(helpMenu);
// Add the actions to the Help menu
helpMenu.add(aboutAction);
return mm;
}
/**
* Creates the toolbar for the application
*/
protected ToolBarManager createToolBarManager(int style) {
// Create the toolbar manager
ToolBarManager tbm = new ToolBarManager(style);
// Add the file actions
tbm.add(newAction);
tbm.add(openAction);
tbm.add(saveAction);
tbm.add(saveAsAction);
// Add a separator
tbm.add(new Separator());
// Add the book actions
tbm.add(addBookAction);
tbm.add(removeBookAction);
// Add a separator
tbm.add(new Separator());
// Add the show book count, which will appear as a toggle button
tbm.add(showBookCountAction);
// Add a separator
tbm.add(new Separator());
// Add the about action
tbm.add(aboutAction);
return tbm;
}
/**
* Creates the coolbar for the application
*/
protected CoolBarManager createCoolBarManager(int style) {
// Create the coolbar manager
CoolBarManager cbm = new CoolBarManager(style);
// Add the toolbar
cbm.add(createToolBarManager(SWT.FLAT));
return cbm;
}
/**
* Creates the status line manager
*/
protected StatusLineManager createStatusLineManager() {
return new StatusLineManager();
}
/**
* Adds a book
*/
public void addBook() {
library.add(new Book("[Enter Title]"));
refreshView();
}
/**
* Removes the selected book
*/
public void removeSelectedBook() {
Book book = (Book) ((IStructuredSelection) viewer.getSelection())
.getFirstElement();
if (book != null)
library.remove(book);
refreshView();
}
/**
* Opens a file
*
* @param fileName
* the file name
*/
public void openFile(final String fileName) {
if (checkOverwrite()) {
// Disable the actions, so user can't change library while loading
enableActions(false);
library = new Library();
try {
// Launch the Open runnable
ModalContext.run(new IRunnableWithProgress() {
public void run(IProgressMonitor progressMonitor) {
try {
progressMonitor.beginTask("Loading",
IProgressMonitor.UNKNOWN);
library.load(fileName);
progressMonitor.done();
viewer.setInput(library);
refreshView();
} catch (IOException e) {
showError("Can't load file " + fileName + "\r"
+ e.getMessage());
}
}
}, true, getStatusLineManager().getProgressMonitor(),
getShell().getDisplay());
} catch (InterruptedException e) {
} catch (InvocationTargetException e) {
} finally {
// Enable actions
enableActions(true);
}
}
}
/**
* Creates a new file
*/
public void newFile() {
if (checkOverwrite()) {
library = new Library();
viewer.setInput(library);
}
}
/**
* Saves the current file
*/
public void saveFile() {
String fileName = library.getFileName();
if (fileName == null) {
fileName = new SafeSaveDialog(getShell()).open();
}
saveFileAs(fileName);
}
/**
* Saves the current file using the specified file name
*
* @param fileName
* the file name
*/
public void saveFileAs(final String fileName) {
// Disable the actions, so user can't change file while it's saving
enableActions(false);
try {
// Launch the Save runnable
ModalContext.run(new IRunnableWithProgress() {
public void run(IProgressMonitor progressMonitor) {
try {
progressMonitor.beginTask("Saving",
IProgressMonitor.UNKNOWN);
library.save(fileName);
progressMonitor.done();
} catch (IOException e) {
showError("Can't save file " + library.getFileName()
+ "\r" + e.getMessage());
}
}
}, true, getStatusLineManager().getProgressMonitor(), getShell()
.getDisplay());
} catch (InterruptedException e) {
} catch (InvocationTargetException e) {
} finally {
// Enable the actions
enableActions(true);
}
}
/**
* Shows an error
*
* @param msg
* the error
*/
public void showError(String msg) {
MessageDialog.openError(getShell(), "Error", msg);
}
/**
* Refreshes the view
*/
public void refreshView() {
// Refresh the view
viewer.refresh();
// Repack the columns
for (int i = 0, n = viewer.getTable().getColumnCount(); i < n; i++) {
viewer.getTable().getColumn(i).pack();
}
getStatusLineManager().setMessage(
showBookCountAction.isChecked() ? "Book Count: "
+ library.getBooks().size() : "");
}
/**
* Checks the current file for unsaved changes. If it has unsaved changes,
* confirms that user wants to overwrite
*
* @return boolean
*/
public boolean checkOverwrite() {
boolean proceed = true;
if (library.isDirty()) {
proceed = MessageDialog
.openConfirm(getShell(), "Are you sure?",
"You have unsaved changes--are you sure you want to lose them?");
}
return proceed;
}
/**
* Sets the current library dirty
*/
public void setLibraryDirty() {
library.setDirty();
}
/**
* Closes the application
*/
public boolean close() {
if (checkOverwrite())
return super.close();
return false;
}
/**
* Enables or disables the actions
*
* @param enable
* true to enable, false to disable
*/
private void enableActions(boolean enable) {
newAction.setEnabled(enable);
openAction.setEnabled(enable);
saveAction.setEnabled(enable);
saveAsAction.setEnabled(enable);
exitAction.setEnabled(enable);
addBookAction.setEnabled(enable);
removeBookAction.setEnabled(enable);
aboutAction.setEnabled(enable);
showBookCountAction.setEnabled(enable);
}
/**
* The application entry point
*
* @param args
* the command line arguments
*/
public static void main(String[] args) {
new Librarian().run();
}
}
/**
* This class holds all the books in a library. It also handles loading from and
* saving to disk
*/
class Library {
private static final String SEP = "|";
// The filename
private String filename;
// The books
private Collection books;
// The dirty flag
private boolean dirty;
/**
* Library constructor Note the signature :-)
*/
public Library() {
books = new LinkedList();
}
/**
* Loads the library from a file
*
* @param filename
* the filename
* @throws IOException
*/
public void load(String filename) throws IOException {
BufferedReader in = new BufferedReader(new LineNumberReader(
new FileReader(filename)));
String line;
while ((line = in.readLine()) != null) {
StringTokenizer st = new StringTokenizer(line, SEP);
Book book = null;
if (st.hasMoreTokens())
book = new Book(st.nextToken());
if (st.hasMoreTokens())
book.checkOut(st.nextToken());
if (book != null)
add(book);
}
in.close();
this.filename = filename;
dirty = false;
}
/**
* Saves the library to a file
*
* @param filename
* the filename
* @throws IOException
*/
public void save(String filename) throws IOException {
BufferedWriter out = new BufferedWriter(new FileWriter(filename));
for (Iterator itr = books.iterator(); itr.hasNext();) {
Book book = (Book) itr.next();
out.write(book.getTitle());
out.write('|');
out.write(book.getCheckedOutTo() == null ? "" : book
.getCheckedOutTo());
out.write('\r');
}
out.close();
this.filename = filename;
dirty = false;
}
/**
* Adds a book
*
* @param book
* the book to add
* @return boolean
*/
public boolean add(Book book) {
boolean added = books.add(book);
if (added)
setDirty();
return added;
}
/**
* Removes a book
*
* @param book
* the book to remove
*/
public void remove(Book book) {
books.remove(book);
setDirty();
}
/**
* Gets the books
*
* @return Collection
*/
public Collection getBooks() {
return Collections.unmodifiableCollection(books);
}
/**
* Gets the file name
*
* @return String
*/
public String getFileName() {
return filename;
}
/**
* Gets whether this file is dirty
*
* @return boolean
*/
public boolean isDirty() {
return dirty;
}
/**
* Sets this file as dirty
*/
public void setDirty() {
dirty = true;
}
}
/**
* This action class deletes a book
*/
class RemoveBookAction extends Action {
/**
* RemoveBookAction constructor
*/
public RemoveBookAction() {
super("&Remove Book@Ctrl+X", ImageDescriptor.createFromFile(
RemoveBookAction.class, "/images/removeBook.gif"));
setDisabledImageDescriptor(ImageDescriptor.createFromFile(
RemoveBookAction.class, "/images/disabledRemoveBook.gif"));
setToolTipText("Remove");
}
/**
* Removes the selected book after confirming
*/
public void run() {
if (MessageDialog.openConfirm(Librarian.getApp().getShell(),
"Are you sure?",
"Are you sure you want to remove the selected book?")) {
Librarian.getApp().removeSelectedBook();
}
}
}
/**
* This action class responds to requests open a file
*/
class OpenAction extends Action {
/**
* OpenAction constructor
*/
public OpenAction() {
super("&Open...@Ctrl+O", ImageDescriptor.createFromFile(
OpenAction.class, "/images/open.gif"));
setDisabledImageDescriptor(ImageDescriptor.createFromFile(
OpenAction.class, "/images/disabledOpen.gif"));
setToolTipText("Open");
}
/**
* Opens an existing file
*/
public void run() {
// Use the file dialog
FileDialog dlg = new FileDialog(Librarian.getApp().getShell(), SWT.OPEN);
String fileName = dlg.open();
if (fileName != null) {
Librarian.getApp().openFile(fileName);
}
}
}
/**
* This action class adds a book
*/
class AddBookAction extends Action {
/**
* AddBookAction constructor
*/
public AddBookAction() {
super("&Add Book@Ctrl+B", ImageDescriptor.createFromFile(
AddBookAction.class, "/images/addBook.gif"));
setDisabledImageDescriptor(ImageDescriptor.createFromFile(
AddBookAction.class, "/images/disabledAddBook.gif"));
setToolTipText("Add");
}
/**
* Adds a book to the current library
*/
public void run() {
Librarian.getApp().addBook();
}
}
/**
* This action class exits the application
*/
class ExitAction extends Action {
/**
* ExitAction constructor
*/
public ExitAction() {
super("E&xit@Alt+F4");
setToolTipText("Exit");
}
/**
* Exits the application
*/
public void run() {
Librarian.getApp().close();
}
}
/**
* This action class reponds to requests for a new file
*/
class NewAction extends Action {
/**
* NewAction constructor
*/
public NewAction() {
super("&New@Ctrl+N", ImageDescriptor.createFromFile(NewAction.class,
"/images/new.gif"));
setDisabledImageDescriptor(ImageDescriptor.createFromFile(
NewAction.class, "/images/disabledNew.gif"));
setToolTipText("New");
}
/**
* Creates a new file
*/
public void run() {
Librarian.getApp().newFile();
}
}
/**
* This action class responds to requests to save a file
*/
class SaveAction extends Action {
/**
* SaveAction constructor
*/
public SaveAction() {
super("&Save@Ctrl+S", ImageDescriptor.createFromFile(SaveAction.class,
"/images/save.gif"));
setDisabledImageDescriptor(ImageDescriptor.createFromFile(
SaveAction.class, "/images/disabledSave.gif"));
setToolTipText("Save");
}
/**
* Saves the file
*/
public void run() {
Librarian.getApp().saveFile();
}
}
/**
* This action class responds to requests to save a file as . . .
*/
class SaveAsAction extends Action {
/**
* SaveAsAction constructor
*/
public SaveAsAction() {
super("Save As...", ImageDescriptor.createFromFile(SaveAsAction.class,
"/images/saveAs.gif"));
setDisabledImageDescriptor(ImageDescriptor.createFromFile(
SaveAsAction.class, "/images/disabledSaveAs.gif"));
setToolTipText("Save As");
}
/**
* Saves the file
*/
public void run() {
SafeSaveDialog dlg = new SafeSaveDialog(Librarian.getApp().getShell());
String fileName = dlg.open();
if (fileName != null) {
Librarian.getApp().saveFileAs(fileName);
}
}
}
/**
* This action class determines whether to show the book count
*/
class ShowBookCountAction extends Action {
public ShowBookCountAction() {
super("&Show Book Count@Ctrl+C", IAction.AS_CHECK_BOX);
setChecked(true);
setImageDescriptor(ImageDescriptor.createFromFile(
ShowBookCountAction.class, "/images/count.gif"));
setDisabledImageDescriptor(ImageDescriptor.createFromFile(
ShowBookCountAction.class, "/images/disabledCount.gif"));
}
}
/**
* This action class shows an About box
*/
class AboutAction extends Action {
/**
* AboutAction constructor
*/
public AboutAction() {
super("&About@Ctrl+A", ImageDescriptor.createFromFile(
AboutAction.class, "/images/about.gif"));
setDisabledImageDescriptor(ImageDescriptor.createFromFile(
AboutAction.class, "/images/disabledAbout.gif"));
setToolTipText("About");
}
/**
* Shows an about box
*/
public void run() {
MessageDialog.openInformation(Librarian.getApp().getShell(), "About",
"Librarian--to manage your books");
}
}
/**
* This class provides a facade for the "save" FileDialog class. If the selected
* file already exists, the user is asked to confirm before overwriting.
*/
class SafeSaveDialog {
// The wrapped FileDialog
private FileDialog dlg;
/**
* SafeSaveDialog constructor
*
* @param shell
* the parent shell
*/
public SafeSaveDialog(Shell shell) {
dlg = new FileDialog(shell, SWT.SAVE);
}
public String open() {
// We store the selected file name in fileName
String fileName = null;
// The user has finished when one of the
// following happens:
// 1) The user dismisses the dialog by pressing Cancel
// 2) The selected file name does not exist
// 3) The user agrees to overwrite existing file
boolean done = false;
while (!done) {
// Open the File Dialog
fileName = dlg.open();
if (fileName == null) {
// User has cancelled, so quit and return
done = true;
} else {
// User has selected a file; see if it already exists
File file = new File(fileName);
if (file.exists()) {
// The file already exists; asks for confirmation
MessageBox mb = new MessageBox(dlg.getParent(),
SWT.ICON_WARNING | SWT.YES | SWT.NO);
// We really should read this string from a
// resource bundle
mb.setMessage(fileName
+ " already exists. Do you want to replace it?");
// If they click Yes, we're done and we drop out. If
// they click No, we redisplay the File Dialog
done = mb.open() == SWT.YES;
} else {
// File does not exist, so drop out
done = true;
}
}
}
return fileName;
}
public String getFileName() {
return dlg.getFileName();
}
public String[] getFileNames() {
return dlg.getFileNames();
}
public String[] getFilterExtensions() {
return dlg.getFilterExtensions();
}
public String[] getFilterNames() {
return dlg.getFilterNames();
}
public String getFilterPath() {
return dlg.getFilterPath();
}
public void setFileName(String string) {
dlg.setFileName(string);
}
public void setFilterExtensions(String[] extensions) {
dlg.setFilterExtensions(extensions);
}
public void setFilterNames(String[] names) {
dlg.setFilterNames(names);
}
public void setFilterPath(String string) {
dlg.setFilterPath(string);
}
public Shell getParent() {
return dlg.getParent();
}
public int getStyle() {
return dlg.getStyle();
}
public String getText() {
return dlg.getText();
}
public void setText(String string) {
dlg.setText(string);
}
}
/**
* This class represents a book
*/
class Book {
private String title;
private String checkedOutTo;
/**
* Book constructor
*
* @param title
* the title
*/
public Book(String title) {
setTitle(title);
}
/**
* Sets the title
*
* @param title
* the title
*/
public void setTitle(String title) {
this.title = title;
}
/**
* Gets the title
*
* @return String
*/
public String getTitle() {
return title;
}
/**
* Check out
*
* @param who
* the person checking this book out
*/
public void checkOut(String who) {
checkedOutTo = who;
if (checkedOutTo.length() == 0)
checkedOutTo = null;
}
public boolean isCheckedOut() {
return checkedOutTo != null && checkedOutTo.length() > 0;
}
public void checkIn() {
checkedOutTo = null;
}
/**
* Gets who this book is checked out to
*
* @return String
*/
public String getCheckedOutTo() {
return checkedOutTo;
}
}
/**
* This class provides the labels for the library table
*/
class LibraryLabelProvider implements ITableLabelProvider {
private Image checked;
private Image unchecked;
/**
* LibraryLabelProvider constructor
*/
public LibraryLabelProvider() {
// Create the check mark images
checked = new Image(null, LibraryLabelProvider.class
.getResourceAsStream("/images/checked.gif"));
unchecked = new Image(null, LibraryLabelProvider.class
.getResourceAsStream("/images/unchecked.gif"));
}
/**
* Gets the column image
*
* @param element
* the book
* @param columnIndex
* the column index
* @return Image
*/
public Image getColumnImage(Object element, int columnIndex) {
// For the "Checked Out" column, return the check mark
// if the book is checked out
if (columnIndex == 1)
return ((Book) element).isCheckedOut() ? checked : unchecked;
return null;
}
/**
* Gets the column text
*
* @param element
* the book
* @param columnIndex
* the column index
* @return String
*/
public String getColumnText(Object element, int columnIndex) {
Book book = (Book) element;
String text = null;
switch (columnIndex) {
case 0:
text = book.getTitle();
break;
case 2:
text = book.getCheckedOutTo();
break;
}
return text == null ? "" : text;
}
/**
* Adds a listener
*/
public void addListener(ILabelProviderListener listener) {
// Ignore
}
/**
* Disposes any resources
*/
public void dispose() {
if (checked != null)
checked.dispose();
if (unchecked != null)
unchecked.dispose();
}
/**
* Gets whether this is a label property
*
* @param element
* the book
* @param property
* the property
* @return boolean
*/
public boolean isLabelProperty(Object element, String property) {
return false;
}
/**
* Removes a listener
*
* @param listener
* the listener
*/
public void removeListener(ILabelProviderListener listener) {
// Ignore
}
}
/**
* This class provides the content for the library table
*/
class LibraryContentProvider implements IStructuredContentProvider {
/**
* Gets the books
*
* @param inputElement
* the library
* @return Object[]
*/
public Object[] getElements(Object inputElement) {
return ((Library) inputElement).getBooks().toArray();
}
/**
* Disposes any resources
*/
public void dispose() {
// Do nothing
}
/**
* Called when the input changes
*
* @param viewer
* the viewer
* @param oldInput
* the old library
* @param newInput
* the new library
*/
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// Ignore
}
}
/**
* This class is the cell modifier for the Librarian program
*/
class LibraryCellModifier implements ICellModifier {
/**
* Gets whether the specified property can be modified
*
* @param element
* the book
* @param property
* the property
* @return boolean
*/
public boolean canModify(Object element, String property) {
return true;
}
/**
* Gets the value for the property
*
* @param element
* the book
* @param property
* the property
* @return Object
*/
public Object getValue(Object element, String property) {
Book book = (Book) element;
if (Librarian.TITLE.equals(property))
return book.getTitle();
else if (Librarian.CHECKED_OUT.equals(property))
return Boolean.valueOf(book.isCheckedOut());
else if (Librarian.WHO.equals(property))
return book.getCheckedOutTo() == null ? "" : book.getCheckedOutTo();
else
return null;
}
/**
* Modifies the element
*
* @param element
* the book
* @param property
* the property
* @param value
* the new value
*/
public void modify(Object element, String property, Object value) {
if (element instanceof Item)
element = ((Item) element).getData();
Book book = (Book) element;
if (Librarian.TITLE.equals(property))
book.setTitle((String) value);
else if (Librarian.CHECKED_OUT.equals(property)) {
boolean b = ((Boolean) value).booleanValue();
if (b)
book.checkOut("[Enter Name]");
else
book.checkIn();
} else if (Librarian.WHO.equals(property))
book.checkOut((String) value);
// Refresh the view
Librarian.getApp().refreshView();
// Set the library dirty
Librarian.getApp().setLibraryDirty();
}
}
|