package com.weecode.plugin.comics.ui.editors; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.beans.BeansObservables; import org.eclipse.core.databinding.observable.ChangeEvent; import org.eclipse.core.databinding.observable.IChangeListener; import org.eclipse.core.databinding.observable.list.WritableList; import org.eclipse.core.databinding.observable.map.IObservableMap; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.jface.databinding.viewers.ObservableListContentProvider; import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.EditorPart; import com.weecode.plugin.comics.model.PublisherEditorModel; import com.weecode.plugin.comics.model.eo.Publisher; import com.weecode.plugin.comics.model.eo.Title; import com.weecode.plugin.comics.ui.dialogs.TitleDialog; /** * * @author Jason Kusnier and Tim Hollosy * */ public class PublishersEditor extends EditorPart { private Button editButton; private TableViewer tableViewer; private Table table; private DataBindingContext m_bindingContext; private Text publisherNameText; public static final String ID = "com.weecode.plugin.comics.ui.editors.PublishersEditor"; //$NON-NLS-1$ private PublisherEditorModel model; private Publisher publisher; private Display display; private WritableList titleList; @Override public void dispose() { model.close(); m_bindingContext.dispose(); super.dispose(); } /** * Create contents of the editor part * @param parent */ @Override public void createPartControl(Composite parent) { display = parent.getDisplay(); Composite container = new Composite(parent, SWT.NONE); final GridLayout gridLayout = new GridLayout(); gridLayout.numColumns = 2; container.setLayout(gridLayout); final Label publisherNameLabel = new Label(container, SWT.NONE); publisherNameLabel.setText("Publisher Name:"); publisherNameText = new Text(container, SWT.BORDER); final GridData gd_publisherNameText = new GridData(SWT.FILL, SWT.CENTER, true, false); publisherNameText.setLayoutData(gd_publisherNameText); final Group composite = new Group(container, SWT.NONE); composite.setText("Titles"); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); final GridLayout gridLayout_1 = new GridLayout(); gridLayout_1.numColumns = 2; composite.setLayout(gridLayout_1); tableViewer = new TableViewer(composite, SWT.VIRTUAL | SWT.FULL_SELECTION | SWT.BORDER); table = tableViewer.getTable(); table.setLinesVisible(true); table.setHeaderVisible(true); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); final TableColumn newColumnTableColumn = new TableColumn(table, SWT.NONE); newColumnTableColumn.setWidth(100); newColumnTableColumn.setText("Format"); final TableColumn newColumnTableColumn_1 = new TableColumn(table, SWT.NONE); newColumnTableColumn_1.setWidth(100); newColumnTableColumn_1.setText("Name"); final Composite composite_1 = new Composite(composite, SWT.NONE); composite_1.setLayout(new GridLayout()); final Button addButton = new Button(composite_1, SWT.NONE); addButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { TitleDialog dialog = new TitleDialog(display.getActiveShell()); if (dialog.open() == Window.OK) { Title title = dialog.getTitle(); //establish fk relationship for weaving title.setPublisher(publisher); //Add to wrapped publisher list titleList.add(title); firePropertyChange(PROP_DIRTY); } } }); addButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); addButton.setText("Add"); editButton = new Button(composite_1, SWT.NONE); editButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { IStructuredSelection sel = (IStructuredSelection)tableViewer.getSelection(); Title title = (Title)sel.getFirstElement(); TitleDialog dialog = new TitleDialog(display.getActiveShell(), title); if (dialog.open() == Window.OK) { firePropertyChange(PROP_DIRTY); } } }); editButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); editButton.setText("Edit"); final Button deleteButton = new Button(composite_1, SWT.NONE); deleteButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { IStructuredSelection sel = (IStructuredSelection)tableViewer.getSelection(); Title title = (Title)sel.getFirstElement(); //not sure why, but we need to explicitly do a remove from the context //otherwise deletes will not fire, unlike inserts which the CascadeType.ALL //on the publishers entity takes care of. model.removeEntity(title); titleList.remove(title); firePropertyChange(PROP_DIRTY); } }); deleteButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); deleteButton.setText("Delete"); new Label(container, SWT.NONE); m_bindingContext = initDataBindings(); } @Override public void setFocus() { // Set the focus } @Override public void doSave(IProgressMonitor monitor) { model.save(); firePropertyChange(PROP_DIRTY); } @Override public void doSaveAs() { // Do the Save As operation } @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { PublishersEditorInput myInput = (PublishersEditorInput)input; model = new PublisherEditorModel(myInput.getPublisher()); publisher = model.getPublisher(); setSite(site); setInput(input); } @Override public boolean isDirty() { return model.isDirty(); } @Override public boolean isSaveAsAllowed() { return false; } protected DataBindingContext initDataBindings() { IObservableValue publisherNameObserveValue = BeansObservables.observeValue(publisher, "name"); IObservableValue publisherNameTextTextObserveWidget = SWTObservables.observeText(publisherNameText, SWT.Modify); // ObservableListContentProvider tableViewerContentProviderList = new ObservableListContentProvider(); tableViewer.setContentProvider(tableViewerContentProviderList); // IObservableMap[] tableViewerLabelProviderMaps = BeansObservables.observeMaps(tableViewerContentProviderList.getKnownElements(), Title.class, new String[]{"format", "name"}); tableViewer.setLabelProvider(new ObservableMapLabelProvider(tableViewerLabelProviderMaps)); // titleList = new WritableList(publisher.getTitles(),Title.class); tableViewer.setInput(titleList); // DataBindingContext bindingContext = new DataBindingContext(); // bindingContext.bindValue(publisherNameTextTextObserveWidget, publisherNameObserveValue, null, null); // publisherNameObserveValue.addChangeListener(new IChangeListener() { @Override public void handleChange(ChangeEvent event) { firePropertyChange(IEditorPart.PROP_DIRTY); } }); return bindingContext; } }