/*
* Beanfabrics Framework Copyright (C) by Michael Karneim, beanfabrics.org
* Use is subject to license terms. See license.txt.
*/
package org.beanfabrics.swt.table;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
import org.beanfabrics.ModelProvider;
import org.beanfabrics.Path;
import org.beanfabrics.View;
import org.beanfabrics.model.AbstractPM;
import org.beanfabrics.model.DatePM;
import org.beanfabrics.model.ListPM;
import org.beanfabrics.model.OperationPM;
import org.beanfabrics.model.PMManager;
import org.beanfabrics.model.TextPM;
import org.beanfabrics.support.OnChange;
import org.beanfabrics.support.Operation;
import org.beanfabrics.support.PropertySupport;
import org.beanfabrics.swt.Decorator;
import org.beanfabrics.swt.model.ImageTextPM;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
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.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
/**
* @author Michael Karneim
*/
public class BnTableTestGUI extends Shell implements View<BnTableTestGUI.ContactNoteList> {
private Button button;
private static final URL EDIT = BnTableTestGUI.class.getResource("edit.gif");
private static final URL VIEW = BnTableTestGUI.class.getResource("view.gif");
private static Image imgEdit;
private static Image imgView;
private Button replaceBnButton;
private Table table2;
private Composite composite;
private Table table;
private Text bnText_2;
private Text bnText_1;
private Text bnText;
private Composite detailPanel;
private ModelProvider modelProvider;
private BnTableDecorator bnTable;
private BnTableDecorator bnTable2;
private Composite centerPanel;
/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
try {
loadImages();
ContactNoteList model = new ContactNoteList();
populate(model);
Display display = Display.getDefault();
BnTableTestGUI shell = new BnTableTestGUI(display, SWT.SHELL_TRIM);
shell.setPresentationModel(model);
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
disposeImages();
}
}
private static void disposeImages() {
if (imgEdit != null) {
imgEdit.dispose();
}
if (imgView != null) {
imgView.dispose();
}
}
private static void loadImages()
throws IOException {
imgEdit = getImage(EDIT.openStream());
imgView = getImage(VIEW.openStream());
}
/**
* Create the shell
*
* @param display
* @param style
*/
public BnTableTestGUI(Display display, int style) {
super(display, style);
modelProvider = new ModelProvider(); // @wb:location=28,436
modelProvider.setPresentationModelType(ContactNoteList.class);
createContents();
setLayout(new FillLayout());
Decorator deco = new Decorator(modelProvider);
deco.decoratePushButton(replaceBnButton, new Path("replaceSelected"));
deco.decorateText(bnText, new Path("firstSelected.name"));
deco.decorateText(bnText_1, new Path("firstSelected.date"));
deco.decorateText(bnText_2, new Path("firstSelected.note"));
}
@Override
protected void checkSubclass() {
// Disable the check that prevents subclassing of SWT components
}
/**
* Create contents of the window
*/
protected void createContents() {
setText("SWT Application");
setSize(500, 375);
centerPanel = new Composite(this, SWT.NONE);
centerPanel.setLayout(new FillLayout());
table = new Table(centerPanel, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
table.setLinesVisible(true);
table.setHeaderVisible(true);
bnTable = new BnTableDecorator(table);
bnTable.setViewConfig(new ViewConfigBuilder().addColumn().setPath("name").setHeader("Name").setWidth(100).addColumn().setPath("date").setHeader("Date").setWidth(80).addColumn().setPath("note").setHeader("Note").setWidth(180)
.buildViewConfig());
bnTable.setPath(new Path("this"));
bnTable.setModelProvider(modelProvider);
detailPanel = new Composite(this, SWT.NONE);
final GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
detailPanel.setLayout(gridLayout);
replaceBnButton = new Button(detailPanel, SWT.PUSH);
replaceBnButton.setText("Replace");
button = new Button(detailPanel, SWT.NONE);
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(final SelectionEvent e) {
if (bnTable2.getModelProvider() == null) {
bnTable2.setModelProvider(modelProvider);
} else {
bnTable2.setModelProvider(null);
}
}
});
button.setText("button");
bnText = new Text(detailPanel, SWT.BORDER);
bnText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
bnText_1 = new Text(detailPanel, SWT.BORDER);
bnText_1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
bnText_2 = new Text(detailPanel, SWT.MULTI | SWT.BORDER);
bnText_2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
composite = new Composite(this, SWT.NONE);
composite.setLayout(new FillLayout());
table2 = new Table(composite, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
table2.setLinesVisible(true);
table2.setHeaderVisible(true);
bnTable2 = new BnTableDecorator(table2);
bnTable2.setViewConfig(new ViewConfigBuilder().addColumn().setPath("name").setHeader("Name").setWidth(100).addColumn().setPath("date").setHeader("Date").setWidth(80).addColumn().setPath("note").setHeader("Note").setWidth(180)
.buildViewConfig());
bnTable2.setPath(new Path("this"));
}
static class ContactNote extends AbstractPM {
ImageTextPM name = new ImageTextPM();
DatePM date = new DatePM();
TextPM note = new TextPM();
public ContactNote() {
PMManager.setup(this);
name.setImage(imgEdit);
name.setEditable(false);
date.setEditable(false);
note.setEditable(true);
}
}
public static class ContactNoteList extends ListPM<ContactNote> {
ContactNote firstSelected;
OperationPM replaceSelected = new OperationPM();
public ContactNoteList() {
PMManager.setup(this);
}
@OnChange
void refreshFirstSelected() {
firstSelected = getSelection().getFirst();
PropertySupport.get(this).refresh();
}
@Operation
void replaceSelected() {
if (firstSelected != null) {
ContactNote newElement = new ContactNote();
this.replace(firstSelected, newElement);
}
}
}
public ContactNoteList getPresentationModel() {
return modelProvider.getPresentationModel();
}
public void setPresentationModel(ContactNoteList pModel) {
modelProvider.setPresentationModel(pModel);
}
static void populate(ContactNoteList list) {
for (int i = 0; i < 100; ++i) {
ContactNote c = new ContactNote();
c.name.setText("Name " + i);
c.date.setDate(new Date());
c.note.setText("Some notes");
list.add(c);
}
}
/**
* Returns an image encoded by the specified input stream
*
* @param is InputStream The input stream encoding the image data
* @return Image The image encoded by the specified input stream
*/
static Image getImage(InputStream is) {
Display display = Display.getCurrent();
ImageData data = new ImageData(is);
if (data.transparentPixel > 0)
return new Image(display, data, data.getTransparencyMask());
return new Image(display, data);
}
}