/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
/* Imports */
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;
import java.util.ResourceBundle;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MenuAdapter;
import org.eclipse.swt.events.MenuEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
/**
* AddressBookExample is an example that uses <code>org.eclipse.swt</code>
* libraries to implement a simple address book. This application has save,
* load, sorting, and searching functions common to basic address books.
*/
public class SWTAddressBook {
private Shell shell;
private Table table;
private SearchDialog searchDialog;
private File file;
private boolean isModified;
private String[] copyBuffer;
private int lastSortColumn = -1;
private static final String DELIMITER = "\t";
private static final String[] columnNames = {
"Last_name","First_name",
"Business_phone","Home_phone",
"Email", "Fax" };
public static void main(String[] args) {
Display display = new Display();
SWTAddressBook application = new SWTAddressBook();
Shell shell = application.open(display);
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
public Shell open(Display display) {
shell = new Shell(display);
shell.setLayout(new FillLayout());
shell.addShellListener(new ShellAdapter() {
public void shellClosed(ShellEvent e) {
e.doit = closeAddressBook();
}
});
createMenuBar();
searchDialog = new SearchDialog(shell);
searchDialog.setSearchAreaNames(columnNames);
searchDialog.setSearchAreaLabel("Column");
searchDialog.addFindListener(new FindListener() {
public boolean find() {
return findEntry();
}
});
table = new Table(shell, SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION);
table.setHeaderVisible(true);
table.setMenu(createPopUpMenu());
table.addSelectionListener(new SelectionAdapter() {
public void widgetDefaultSelected(SelectionEvent e) {
TableItem[] items = table.getSelection();
if (items.length > 0)
editEntry(items[0]);
}
});
for (int i = 0; i < columnNames.length; i++) {
TableColumn column = new TableColumn(table, SWT.NONE);
column.setText(columnNames[i]);
column.setWidth(150);
final int columnIndex = i;
column.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
sort(columnIndex);
}
});
}
newAddressBook();
shell.setSize(table.computeSize(SWT.DEFAULT, SWT.DEFAULT).x, 300);
shell.open();
return shell;
}
private boolean closeAddressBook() {
if (isModified) {
// ask user if they want to save current address book
MessageBox box = new MessageBox(shell, SWT.ICON_WARNING | SWT.YES
| SWT.NO | SWT.CANCEL);
box.setText(shell.getText());
box.setMessage("Close_save");
int choice = box.open();
if (choice == SWT.CANCEL) {
return false;
} else if (choice == SWT.YES) {
if (!save())
return false;
}
}
TableItem[] items = table.getItems();
for (int i = 0; i < items.length; i++) {
items[i].dispose();
}
return true;
}
/**
* Creates the menu at the top of the shell where most of the programs
* functionality is accessed.
*
* @return The <code>Menu</code> widget that was created
*/
private Menu createMenuBar() {
Menu menuBar = new Menu(shell, SWT.BAR);
shell.setMenuBar(menuBar);
// create each header and subMenu for the menuBar
createFileMenu(menuBar);
createEditMenu(menuBar);
createSearchMenu(menuBar);
createHelpMenu(menuBar);
return menuBar;
}
/**
* Converts an encoded <code>String</code> to a String array representing
* a table entry.
*/
private String[] decodeLine(String line) {
if (line == null)
return null;
String[] parsedLine = new String[table.getColumnCount()];
for (int i = 0; i < parsedLine.length - 1; i++) {
int index = line.indexOf(DELIMITER);
if (index > -1) {
parsedLine[i] = line.substring(0, index);
line = line
.substring(index + DELIMITER.length(), line.length());
} else {
return null;
}
}
if (line.indexOf(DELIMITER) != -1)
return null;
parsedLine[parsedLine.length - 1] = line;
return parsedLine;
}
private void displayError(String msg) {
MessageBox box = new MessageBox(shell, SWT.ICON_ERROR);
box.setMessage(msg);
box.open();
}
private void editEntry(TableItem item) {
DataEntryDialog dialog = new DataEntryDialog(shell);
dialog.setLabels(columnNames);
String[] values = new String[table.getColumnCount()];
for (int i = 0; i < values.length; i++) {
values[i] = item.getText(i);
}
dialog.setValues(values);
values = dialog.open();
if (values != null) {
item.setText(values);
isModified = true;
}
}
private String encodeLine(String[] tableItems) {
String line = "";
for (int i = 0; i < tableItems.length - 1; i++) {
line += tableItems[i] + DELIMITER;
}
line += tableItems[tableItems.length - 1] + "\n";
return line;
}
private boolean findEntry() {
Cursor waitCursor = new Cursor(shell.getDisplay(), SWT.CURSOR_WAIT);
shell.setCursor(waitCursor);
boolean matchCase = searchDialog.getMatchCase();
boolean matchWord = searchDialog.getMatchWord();
String searchString = searchDialog.getSearchString();
int column = searchDialog.getSelectedSearchArea();
searchString = matchCase ? searchString : searchString.toLowerCase();
boolean found = false;
if (searchDialog.getSearchDown()) {
for (int i = table.getSelectionIndex() + 1; i < table
.getItemCount(); i++) {
if (found = findMatch(searchString, table.getItem(i), column,
matchWord, matchCase)) {
table.setSelection(i);
break;
}
}
} else {
for (int i = table.getSelectionIndex() - 1; i > -1; i--) {
if (found = findMatch(searchString, table.getItem(i), column,
matchWord, matchCase)) {
table.setSelection(i);
break;
}
}
}
shell.setCursor(null);
if (waitCursor != null)
waitCursor.dispose();
return found;
}
private boolean findMatch(String searchString, TableItem item, int column,
boolean matchWord, boolean matchCase) {
String tableText = matchCase ? item.getText(column) : item.getText(
column).toLowerCase();
if (matchWord) {
if (tableText != null && tableText.equals(searchString)) {
return true;
}
} else {
if (tableText != null && tableText.indexOf(searchString) != -1) {
return true;
}
}
return false;
}
private void newAddressBook() {
shell.setText("Title_bar"
+ "New_title");
file = null;
isModified = false;
}
private void newEntry() {
DataEntryDialog dialog = new DataEntryDialog(shell);
dialog.setLabels(columnNames);
String[] data = dialog.open();
if (data != null) {
TableItem item = new TableItem(table, SWT.NONE);
item.setText(data);
isModified = true;
}
}
private void openAddressBook() {
FileDialog fileDialog = new FileDialog(shell, SWT.OPEN);
fileDialog.setFilterExtensions(new String[] { "*.adr;", "*.*" });
fileDialog.setFilterNames(new String[] {
"Book_filter_name" + " (*.adr)",
"All_filter_name" + " (*.*)" });
String name = fileDialog.open();
if (name == null)
return;
File file = new File(name);
if (!file.exists()) {
displayError("File" + file.getName()
+ " " + "Does_not_exist");
return;
}
Cursor waitCursor = new Cursor(shell.getDisplay(), SWT.CURSOR_WAIT);
shell.setCursor(waitCursor);
FileReader fileReader = null;
BufferedReader bufferedReader = null;
String[] data = new String[0];
try {
fileReader = new FileReader(file.getAbsolutePath());
bufferedReader = new BufferedReader(fileReader);
String nextLine = bufferedReader.readLine();
while (nextLine != null) {
String[] newData = new String[data.length + 1];
System.arraycopy(data, 0, newData, 0, data.length);
newData[data.length] = nextLine;
data = newData;
nextLine = bufferedReader.readLine();
}
} catch (FileNotFoundException e) {
displayError("File_not_found" + "\n"
+ file.getName());
return;
} catch (IOException e) {
displayError("IO_error_read" + "\n"
+ file.getName());
return;
} finally {
shell.setCursor(null);
waitCursor.dispose();
if (fileReader != null) {
try {
fileReader.close();
} catch (IOException e) {
displayError("IO_error_close"
+ "\n" + file.getName());
return;
}
}
}
String[][] tableInfo = new String[data.length][table.getColumnCount()];
int writeIndex = 0;
for (int i = 0; i < data.length; i++) {
String[] line = decodeLine(data[i]);
if (line != null)
tableInfo[writeIndex++] = line;
}
if (writeIndex != data.length) {
String[][] result = new String[writeIndex][table.getColumnCount()];
System.arraycopy(tableInfo, 0, result, 0, writeIndex);
tableInfo = result;
}
Arrays.sort(tableInfo, new RowComparator(0));
for (int i = 0; i < tableInfo.length; i++) {
TableItem item = new TableItem(table, SWT.NONE);
item.setText(tableInfo[i]);
}
shell.setText("Title_bar"
+ fileDialog.getFileName());
isModified = false;
this.file = file;
}
private boolean save() {
if (file == null)
return saveAs();
Cursor waitCursor = new Cursor(shell.getDisplay(), SWT.CURSOR_WAIT);
shell.setCursor(waitCursor);
TableItem[] items = table.getItems();
String[] lines = new String[items.length];
for (int i = 0; i < items.length; i++) {
String[] itemText = new String[table.getColumnCount()];
for (int j = 0; j < itemText.length; j++) {
itemText[j] = items[i].getText(j);
}
lines[i] = encodeLine(itemText);
}
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter(file.getAbsolutePath(), false);
for (int i = 0; i < lines.length; i++) {
fileWriter.write(lines[i]);
}
} catch (FileNotFoundException e) {
displayError("File_not_found" + "\n"
+ file.getName());
return false;
} catch (IOException e) {
displayError("IO_error_write" + "\n"
+ file.getName());
return false;
} finally {
shell.setCursor(null);
waitCursor.dispose();
if (fileWriter != null) {
try {
fileWriter.close();
} catch (IOException e) {
displayError("IO_error_close"
+ "\n" + file.getName());
return false;
}
}
}
shell.setText("Title_bar" + file.getName());
isModified = false;
return true;
}
private boolean saveAs() {
FileDialog saveDialog = new FileDialog(shell, SWT.SAVE);
saveDialog.setFilterExtensions(new String[] { "*.adr;", "*.*" });
saveDialog.setFilterNames(new String[] { "Address Books (*.adr)",
"All Files " });
saveDialog.open();
String name = saveDialog.getFileName();
if (name.equals(""))
return false;
if (name.indexOf(".adr") != name.length() - 4) {
name += ".adr";
}
File file = new File(saveDialog.getFilterPath(), name);
if (file.exists()) {
MessageBox box = new MessageBox(shell, SWT.ICON_WARNING | SWT.YES
| SWT.NO);
box.setText("Save_as_title");
box.setMessage("File" + file.getName()
+ " " + "Query_overwrite");
if (box.open() != SWT.YES) {
return false;
}
}
this.file = file;
return save();
}
private void sort(int column) {
if (table.getItemCount() <= 1)
return;
TableItem[] items = table.getItems();
String[][] data = new String[items.length][table.getColumnCount()];
for (int i = 0; i < items.length; i++) {
for (int j = 0; j < table.getColumnCount(); j++) {
data[i][j] = items[i].getText(j);
}
}
Arrays.sort(data, new RowComparator(column));
if (lastSortColumn != column) {
for (int i = 0; i < data.length; i++) {
items[i].setText(data[i]);
}
lastSortColumn = column;
} else {
// reverse order if the current column is selected again
int j = data.length - 1;
for (int i = 0; i < data.length; i++) {
items[i].setText(data[j--]);
}
lastSortColumn = -1;
}
}
/**
* Creates all the items located in the File submenu and associate all the
* menu items with their appropriate functions.
*
* @param menuBar
* Menu the <code>Menu</code> that file contain the File
* submenu.
*/
private void createFileMenu(Menu menuBar) {
// File menu.
MenuItem item = new MenuItem(menuBar, SWT.CASCADE);
item.setText("File_menu_title");
Menu menu = new Menu(shell, SWT.DROP_DOWN);
item.setMenu(menu);
/**
* Adds a listener to handle enabling and disabling some items in the
* Edit submenu.
*/
menu.addMenuListener(new MenuAdapter() {
public void menuShown(MenuEvent e) {
Menu menu = (Menu) e.widget;
MenuItem[] items = menu.getItems();
items[1].setEnabled(table.getSelectionCount() != 0); // edit
// contact
items[5].setEnabled((file != null) && isModified); // save
items[6].setEnabled(table.getItemCount() != 0); // save as
}
});
// File -> New Contact
MenuItem subItem = new MenuItem(menu, SWT.NULL);
subItem.setText("New_contact");
subItem.setAccelerator(SWT.MOD1 + 'N');
subItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
newEntry();
}
});
subItem = new MenuItem(menu, SWT.NULL);
subItem.setText("Edit_contact");
subItem.setAccelerator(SWT.MOD1 + 'E');
subItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TableItem[] items = table.getSelection();
if (items.length == 0)
return;
editEntry(items[0]);
}
});
new MenuItem(menu, SWT.SEPARATOR);
// File -> New Address Book
subItem = new MenuItem(menu, SWT.NULL);
subItem.setText("New_address_book");
subItem.setAccelerator(SWT.MOD1 + 'B');
subItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (closeAddressBook()) {
newAddressBook();
}
}
});
// File -> Open
subItem = new MenuItem(menu, SWT.NULL);
subItem.setText("Open_address_book");
subItem.setAccelerator(SWT.MOD1 + 'O');
subItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (closeAddressBook()) {
openAddressBook();
}
}
});
// File -> Save.
subItem = new MenuItem(menu, SWT.NULL);
subItem.setText("Save_address_book");
subItem.setAccelerator(SWT.MOD1 + 'S');
subItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
save();
}
});
// File -> Save As.
subItem = new MenuItem(menu, SWT.NULL);
subItem.setText("Save_book_as");
subItem.setAccelerator(SWT.MOD1 + 'A');
subItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
saveAs();
}
});
new MenuItem(menu, SWT.SEPARATOR);
// File -> Exit.
subItem = new MenuItem(menu, SWT.NULL);
subItem.setText("Exit");
subItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
shell.close();
}
});
}
/**
* Creates all the items located in the Edit submenu and associate all the
* menu items with their appropriate functions.
*
* @param menuBar
* Menu the <code>Menu</code> that file contain the Edit
* submenu.
*
* @see #createSortMenu()
*/
private MenuItem createEditMenu(Menu menuBar) {
// Edit menu.
MenuItem item = new MenuItem(menuBar, SWT.CASCADE);
item.setText("Edit_menu_title");
Menu menu = new Menu(shell, SWT.DROP_DOWN);
item.setMenu(menu);
/**
* Add a listener to handle enabling and disabling some items in the
* Edit submenu.
*/
menu.addMenuListener(new MenuAdapter() {
public void menuShown(MenuEvent e) {
Menu menu = (Menu) e.widget;
MenuItem[] items = menu.getItems();
int count = table.getSelectionCount();
items[0].setEnabled(count != 0); // edit
items[1].setEnabled(count != 0); // copy
items[2].setEnabled(copyBuffer != null); // paste
items[3].setEnabled(count != 0); // delete
items[5].setEnabled(table.getItemCount() != 0); // sort
}
});
// Edit -> Edit
MenuItem subItem = new MenuItem(menu, SWT.CASCADE);
subItem.setText("Edit");
subItem.setAccelerator(SWT.MOD1 + 'E');
subItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TableItem[] items = table.getSelection();
if (items.length == 0)
return;
editEntry(items[0]);
}
});
// Edit -> Copy
subItem = new MenuItem(menu, SWT.NULL);
subItem.setText("Copy");
subItem.setAccelerator(SWT.MOD1 + 'C');
subItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TableItem[] items = table.getSelection();
if (items.length == 0)
return;
copyBuffer = new String[table.getColumnCount()];
for (int i = 0; i < copyBuffer.length; i++) {
copyBuffer[i] = items[0].getText(i);
}
}
});
// Edit -> Paste
subItem = new MenuItem(menu, SWT.NULL);
subItem.setText("Paste");
subItem.setAccelerator(SWT.MOD1 + 'V');
subItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (copyBuffer == null)
return;
TableItem item = new TableItem(table, SWT.NONE);
item.setText(copyBuffer);
isModified = true;
}
});
// Edit -> Delete
subItem = new MenuItem(menu, SWT.NULL);
subItem.setText("Delete");
subItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TableItem[] items = table.getSelection();
if (items.length == 0)
return;
items[0].dispose();
isModified = true;
}
});
new MenuItem(menu, SWT.SEPARATOR);
// Edit -> Sort(Cascade)
subItem = new MenuItem(menu, SWT.CASCADE);
subItem.setText("Sort");
Menu submenu = createSortMenu();
subItem.setMenu(submenu);
return item;
}
/**
* Creates all the items located in the Sort cascading submenu and associate
* all the menu items with their appropriate functions.
*
* @return Menu The cascading menu with all the sort menu items on it.
*/
private Menu createSortMenu() {
Menu submenu = new Menu(shell, SWT.DROP_DOWN);
MenuItem subitem;
for (int i = 0; i < columnNames.length; i++) {
subitem = new MenuItem(submenu, SWT.NULL);
subitem.setText(columnNames[i]);
final int column = i;
subitem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
sort(column);
}
});
}
return submenu;
}
/**
* Creates all the items located in the Search submenu and associate all the
* menu items with their appropriate functions.
*
* @param menuBar
* Menu the <code>Menu</code> that file contain the Search
* submenu.
*/
private void createSearchMenu(Menu menuBar) {
// Search menu.
MenuItem item = new MenuItem(menuBar, SWT.CASCADE);
item.setText("Search_menu_title");
Menu searchMenu = new Menu(shell, SWT.DROP_DOWN);
item.setMenu(searchMenu);
// Search -> Find...
item = new MenuItem(searchMenu, SWT.NULL);
item.setText("Find");
item.setAccelerator(SWT.MOD1 + 'F');
item.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
searchDialog.setMatchCase(false);
searchDialog.setMatchWord(false);
searchDialog.setSearchDown(true);
searchDialog.setSearchString("");
searchDialog.setSelectedSearchArea(0);
searchDialog.open();
}
});
// Search -> Find Next
item = new MenuItem(searchMenu, SWT.NULL);
item.setText("Find_next");
item.setAccelerator(SWT.F3);
item.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
searchDialog.open();
}
});
}
/**
* Creates all items located in the popup menu and associates all the menu
* items with their appropriate functions.
*
* @return Menu The created popup menu.
*/
private Menu createPopUpMenu() {
Menu popUpMenu = new Menu(shell, SWT.POP_UP);
/**
* Adds a listener to handle enabling and disabling some items in the
* Edit submenu.
*/
popUpMenu.addMenuListener(new MenuAdapter() {
public void menuShown(MenuEvent e) {
Menu menu = (Menu) e.widget;
MenuItem[] items = menu.getItems();
int count = table.getSelectionCount();
items[2].setEnabled(count != 0); // edit
items[3].setEnabled(count != 0); // copy
items[4].setEnabled(copyBuffer != null); // paste
items[5].setEnabled(count != 0); // delete
items[7].setEnabled(table.getItemCount() != 0); // find
}
});
// New
MenuItem item = new MenuItem(popUpMenu, SWT.CASCADE);
item.setText("Pop_up_new");
item.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
newEntry();
}
});
new MenuItem(popUpMenu, SWT.SEPARATOR);
// Edit
item = new MenuItem(popUpMenu, SWT.CASCADE);
item.setText("Pop_up_edit");
item.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TableItem[] items = table.getSelection();
if (items.length == 0)
return;
editEntry(items[0]);
}
});
// Copy
item = new MenuItem(popUpMenu, SWT.CASCADE);
item.setText("Pop_up_copy");
item.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TableItem[] items = table.getSelection();
if (items.length == 0)
return;
copyBuffer = new String[table.getColumnCount()];
for (int i = 0; i < copyBuffer.length; i++) {
copyBuffer[i] = items[0].getText(i);
}
}
});
// Paste
item = new MenuItem(popUpMenu, SWT.CASCADE);
item.setText("Pop_up_paste");
item.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (copyBuffer == null)
return;
TableItem item = new TableItem(table, SWT.NONE);
item.setText(copyBuffer);
isModified = true;
}
});
// Delete
item = new MenuItem(popUpMenu, SWT.CASCADE);
item.setText("Pop_up_delete");
item.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TableItem[] items = table.getSelection();
if (items.length == 0)
return;
items[0].dispose();
isModified = true;
}
});
new MenuItem(popUpMenu, SWT.SEPARATOR);
// Find...
item = new MenuItem(popUpMenu, SWT.NULL);
item.setText("Pop_up_find");
item.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
searchDialog.open();
}
});
return popUpMenu;
}
/**
* Creates all the items located in the Help submenu and associate all the
* menu items with their appropriate functions.
*
* @param menuBar
* Menu the <code>Menu</code> that file contain the Help
* submenu.
*/
private void createHelpMenu(Menu menuBar) {
// Help Menu
MenuItem item = new MenuItem(menuBar, SWT.CASCADE);
item.setText("Help_menu_title");
Menu menu = new Menu(shell, SWT.DROP_DOWN);
item.setMenu(menu);
// Help -> About Text Editor
MenuItem subItem = new MenuItem(menu, SWT.NULL);
subItem.setText("About");
subItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
MessageBox box = new MessageBox(shell, SWT.NONE);
box.setText("About_1"
+ shell.getText());
box.setMessage(shell.getText()
+ "About_2");
box.open();
}
});
}
/**
* To compare entries (rows) by the given column
*/
private class RowComparator implements Comparator {
private int column;
/**
* Constructs a RowComparator given the column index
*
* @param col
* The index (starting at zero) of the column
*/
public RowComparator(int col) {
column = col;
}
/**
* Compares two rows (type String[]) using the specified column entry.
*
* @param obj1
* First row to compare
* @param obj2
* Second row to compare
* @return negative if obj1 less than obj2, positive if obj1 greater
* than obj2, and zero if equal.
*/
public int compare(Object obj1, Object obj2) {
String[] row1 = (String[]) obj1;
String[] row2 = (String[]) obj2;
return row1[column].compareTo(row2[column]);
}
}
}
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors: IBM Corporation - initial API and implementation
******************************************************************************/
/**
* SearchDialog is a simple class that uses <code>org.eclipse.swt</code>
* libraries to implement a basic search dialog.
*/
class SearchDialog {
Shell shell;
Text searchText;
Combo searchArea;
Label searchAreaLabel;
Button matchCase;
Button matchWord;
Button findButton;
Button down;
FindListener findHandler;
/**
* Class constructor that sets the parent shell and the table widget that
* the dialog will search.
*
* @param parent
* Shell The shell that is the parent of the dialog.
*/
public SearchDialog(Shell parent) {
shell = new Shell(parent, SWT.CLOSE | SWT.BORDER | SWT.TITLE);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
shell.setLayout(layout);
shell.setText("Search");
shell.addShellListener(new ShellAdapter() {
public void shellClosed(ShellEvent e) {
// don't dispose of the shell, just hide it for later use
e.doit = false;
shell.setVisible(false);
}
});
Label label = new Label(shell, SWT.LEFT);
label.setText("Dialog_find_what");
searchText = new Text(shell, SWT.BORDER);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.widthHint = 200;
searchText.setLayoutData(gridData);
searchText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
boolean enableFind = (searchText.getCharCount() != 0);
findButton.setEnabled(enableFind);
}
});
searchAreaLabel = new Label(shell, SWT.LEFT);
searchArea = new Combo(shell, SWT.DROP_DOWN | SWT.READ_ONLY);
gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.widthHint = 200;
searchArea.setLayoutData(gridData);
matchCase = new Button(shell, SWT.CHECK);
matchCase.setText("Dialog_match_case");
gridData = new GridData();
gridData.horizontalSpan = 2;
matchCase.setLayoutData(gridData);
matchWord = new Button(shell, SWT.CHECK);
matchWord.setText("Dialog_match_word");
gridData = new GridData();
gridData.horizontalSpan = 2;
matchWord.setLayoutData(gridData);
Group direction = new Group(shell, SWT.NONE);
gridData = new GridData();
gridData.horizontalSpan = 2;
direction.setLayoutData(gridData);
direction.setLayout(new FillLayout());
direction.setText("Dialog_direction");
Button up = new Button(direction, SWT.RADIO);
up.setText("Dialog_dir_up");
up.setSelection(false);
down = new Button(direction, SWT.RADIO);
down.setText("Dialog_dir_down");
down.setSelection(true);
Composite composite = new Composite(shell, SWT.NONE);
gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gridData.horizontalSpan = 2;
composite.setLayoutData(gridData);
layout = new GridLayout();
layout.numColumns = 2;
layout.makeColumnsEqualWidth = true;
composite.setLayout(layout);
findButton = new Button(composite, SWT.PUSH);
findButton.setText("Dialog_find");
findButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
findButton.setEnabled(false);
findButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (!findHandler.find()) {
MessageBox box = new MessageBox(shell, SWT.ICON_INFORMATION
| SWT.OK | SWT.PRIMARY_MODAL);
box.setText(shell.getText());
box.setMessage("Cannot_find"
+ "\"" + searchText.getText() + "\"");
box.open();
}
}
});
Button cancelButton = new Button(composite, SWT.PUSH);
cancelButton.setText("Cancel");
cancelButton.setLayoutData(new GridData(
GridData.HORIZONTAL_ALIGN_BEGINNING));
cancelButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
shell.setVisible(false);
}
});
shell.pack();
}
public String getSearchAreaLabel(String label) {
return searchAreaLabel.getText();
}
public String[] getsearchAreaNames() {
return searchArea.getItems();
}
public boolean getMatchCase() {
return matchCase.getSelection();
}
public boolean getMatchWord() {
return matchWord.getSelection();
}
public String getSearchString() {
return searchText.getText();
}
public boolean getSearchDown() {
return down.getSelection();
}
public int getSelectedSearchArea() {
return searchArea.getSelectionIndex();
}
public void open() {
if (shell.isVisible()) {
shell.setFocus();
} else {
shell.open();
}
searchText.setFocus();
}
public void setSearchAreaNames(String[] names) {
for (int i = 0; i < names.length; i++) {
searchArea.add(names[i]);
}
searchArea.select(0);
}
public void setSearchAreaLabel(String label) {
searchAreaLabel.setText(label);
}
public void setMatchCase(boolean match) {
matchCase.setSelection(match);
}
public void setMatchWord(boolean match) {
matchWord.setSelection(match);
}
public void setSearchDown(boolean searchDown) {
down.setSelection(searchDown);
}
public void setSearchString(String searchString) {
searchText.setText(searchString);
}
public void setSelectedSearchArea(int index) {
searchArea.select(index);
}
public void addFindListener(FindListener listener) {
this.findHandler = listener;
}
public void removeFindListener(FindListener listener) {
this.findHandler = null;
}
}
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors: IBM Corporation - initial API and implementation
******************************************************************************/
interface FindListener {
public boolean find();
}
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors: IBM Corporation - initial API and implementation
******************************************************************************/
/**
* DataEntryDialog class uses <code>org.eclipse.swt</code> libraries to
* implement a dialog that accepts basic personal information that is added to a
* <code>Table</code> widget or edits a <code>TableItem</code> entry to
* represent the entered data.
*/
class DataEntryDialog {
Shell shell;
String[] values;
String[] labels;
public DataEntryDialog(Shell parent) {
shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.PRIMARY_MODAL);
shell.setLayout(new GridLayout());
}
private void addTextListener(final Text text) {
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
Integer index = (Integer) (text.getData("index"));
values[index.intValue()] = text.getText();
}
});
}
private void createControlButtons() {
Composite composite = new Composite(shell, SWT.NULL);
composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
GridLayout layout = new GridLayout();
layout.numColumns = 2;
composite.setLayout(layout);
Button okButton = new Button(composite, SWT.PUSH);
okButton.setText("OK");
okButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
shell.close();
}
});
Button cancelButton = new Button(composite, SWT.PUSH);
cancelButton.setText("Cancel");
cancelButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
values = null;
shell.close();
}
});
shell.setDefaultButton(okButton);
}
private void createTextWidgets() {
if (labels == null)
return;
Composite composite = new Composite(shell, SWT.NULL);
composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
GridLayout layout = new GridLayout();
layout.numColumns = 2;
composite.setLayout(layout);
if (values == null)
values = new String[labels.length];
for (int i = 0; i < labels.length; i++) {
Label label = new Label(composite, SWT.RIGHT);
label.setText(labels[i]);
Text text = new Text(composite, SWT.BORDER);
GridData gridData = new GridData();
gridData.widthHint = 400;
text.setLayoutData(gridData);
if (values[i] != null) {
text.setText(values[i]);
}
text.setData("index", new Integer(i));
addTextListener(text);
}
}
public String[] getLabels() {
return labels;
}
public String getTitle() {
return shell.getText();
}
/**
* Returns the contents of the <code>Text</code> widgets in the dialog in
* a <code>String</code> array.
*
* @return String[] The contents of the text widgets of the dialog. May
* return null if all text widgets are empty.
*/
public String[] getValues() {
return values;
}
/**
* Opens the dialog in the given state. Sets <code>Text</code> widget
* contents and dialog behaviour accordingly.
*
* @param dialogState
* int The state the dialog should be opened in.
*/
public String[] open() {
createTextWidgets();
createControlButtons();
shell.pack();
shell.open();
Display display = shell.getDisplay();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
return getValues();
}
public void setLabels(String[] labels) {
this.labels = labels;
}
public void setTitle(String title) {
shell.setText(title);
}
/**
* Sets the values of the <code>Text</code> widgets of the dialog to the
* values supplied in the parameter array.
*
* @param itemInfo
* String[] The values to which the dialog contents will be set.
*/
public void setValues(String[] itemInfo) {
if (labels == null)
return;
if (values == null)
values = new String[labels.length];
int numItems = Math.min(values.length, itemInfo.length);
for (int i = 0; i < numItems; i++) {
values[i] = itemInfo[i];
}
}
}
|