/**
* This file is part of Archiv-Editor.
*
* The software Archiv-Editor serves as a client user interface for working with
* the Person Data Repository. See: pdr.bbaw.de
*
* The software Archiv-Editor was developed at the Berlin-Brandenburg Academy
* of Sciences and Humanities, Jägerstr. 22/23, D-10117 Berlin.
* www.bbaw.de
*
* Copyright (C) 2010-2013 Berlin-Brandenburg Academy
* of Sciences and Humanities
*
* The software Archiv-Editor was developed by @author: Christoph Plutte.
*
* Archiv-Editor is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Archiv-Editor is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Archiv-Editor.
* If not, see <http://www.gnu.org/licenses/lgpl-3.0.html>.
*/
package org.bbaw.pdr.ae.view.control.customSWTWidges;
import java.util.ArrayList;
import org.bbaw.pdr.ae.common.AEVIEWConstants;
import org.bbaw.pdr.ae.common.CommonActivator;
import org.bbaw.pdr.ae.common.NLMessages;
import org.bbaw.pdr.ae.common.icons.IconsInternal;
import org.bbaw.pdr.ae.control.facade.Facade;
import org.bbaw.pdr.ae.metamodel.PdrId;
import org.bbaw.pdr.ae.model.PdrObject;
import org.bbaw.pdr.ae.model.Reference;
import org.bbaw.pdr.ae.model.ReferenceMods;
import org.bbaw.pdr.ae.model.ValidationStm;
import org.bbaw.pdr.ae.model.view.Facet;
import org.bbaw.pdr.ae.view.control.dialogs.SelectObjectDialog;
import org.bbaw.pdr.ae.view.control.interfaces.IAEBasicEditor;
import org.bbaw.pdr.ae.view.control.provider.AutoCompleteNameLabelProvider;
import org.bbaw.pdr.ae.view.control.provider.FacetContentProposalProvider;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.NotEnabledException;
import org.eclipse.core.commands.NotHandledException;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.jface.fieldassist.AutoCompleteField;
import org.eclipse.jface.fieldassist.ContentProposalAdapter;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.jface.fieldassist.IContentProposal;
import org.eclipse.jface.fieldassist.IContentProposalListener;
import org.eclipse.jface.fieldassist.TextContentAdapter;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
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.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.IHandlerService;
public class ValidationEditorLine extends Composite implements IAEBasicEditor
{
private ValidationStm _validationStm;
private Composite _composite;
private Button _searchButton;
private Button _newButton;
private Text _sourceText;
private Text _sourcePageText;
private Label _labelSource;
private Label _labelInternal;
private boolean _isValid = true;
private boolean _isDirty = false;
private ControlDecoration _decoValId;
/** The WHIT e_ color. */
private static final Color WHITE_COLOR = Display.getDefault().getSystemColor(SWT.COLOR_WHITE);
private Facade _facade = Facade.getInstanz();
private IAEBasicEditor _parentEditor;
/** Instance of shared image registry. */
private ImageRegistry _imageReg = CommonActivator.getDefault().getImageRegistry();
/** The _selection listener. */
private ArrayList<SelectionListener> _selectionListener = new ArrayList<SelectionListener>();
private boolean _showLabel;
private Button _editRefButton;
private boolean _selected;
private boolean _editable = true;
public ValidationEditorLine(IAEBasicEditor parentEditor, ValidationStm validationStm, Composite parent,
boolean showLabel, int style)
{
super(parent, style);
_parentEditor = parentEditor;
_validationStm = validationStm;
_showLabel = showLabel;
createEditor();
if (_validationStm == null)
{
_validationStm = new ValidationStm();
_validationStm.setReference(new Reference());
_validationStm.setAuthority(_facade.getCurrentUser().getPdrId());
setValidationQuality();
}
else
{
loadValidation();
}
validateInternal();
// _composite.pack();
_composite.layout();
// this.setSize(SWT.DEFAULT, 18);
// this.pack();
this.layout();
}
public final void addSelectionListener(final SelectionListener listener)
{
if (listener != null)
{
_selectionListener.add(listener);
}
}
private void createEditor()
{
this.setLayout(new GridLayout(1, false));
((GridLayout) this.getLayout()).marginHeight = 0;
((GridLayout) this.getLayout()).verticalSpacing = 0;
_composite = new Composite(this, SWT.NONE);
_composite.setLayoutData(new GridData());
((GridData) _composite.getLayoutData()).horizontalAlignment = SWT.FILL;
((GridData) _composite.getLayoutData()).grabExcessHorizontalSpace = true;
_composite.setLayout(new GridLayout(12, false));
((GridLayout) _composite.getLayout()).marginHeight = 0;
((GridLayout) _composite.getLayout()).verticalSpacing = 0;
if (_showLabel)
{
((GridLayout) _composite.getLayout()).numColumns = 13;
_labelSource = new Label(_composite, SWT.NONE);
_labelSource.setText(NLMessages.getString("Editor_reference") + "*");
_labelSource.setLayoutData(new GridData());
((GridData) _labelSource.getLayoutData()).horizontalSpan = 1;
((GridData) _labelSource.getLayoutData()).horizontalAlignment = SWT.RIGHT;
}
_sourceText = new Text(_composite, SWT.BORDER);
_sourceText.setBackground(WHITE_COLOR);
_sourceText.setLayoutData(new GridData());
((GridData) _sourceText.getLayoutData()).horizontalSpan = 5;
((GridData) _sourceText.getLayoutData()).horizontalAlignment = SWT.FILL;
((GridData) _sourceText.getLayoutData()).grabExcessHorizontalSpace = true;
_sourceText.addFocusListener(new FocusListener()
{
@Override
public void focusGained(final FocusEvent e)
{
Event ee = new Event();
ee.widget = ValidationEditorLine.this;
SelectionEvent se = new SelectionEvent(ee);
for (SelectionListener s : _selectionListener)
{
s.widgetSelected(se);
}
ContentProposalAdapter adapter = new ContentProposalAdapter(_sourceText, new TextContentAdapter(),
new FacetContentProposalProvider(_facade.getAllReferenceFacets()), null,
null);
adapter.setLabelProvider(new AutoCompleteNameLabelProvider());
adapter.addContentProposalListener(new IContentProposalListener()
{
@Override
public void proposalAccepted(final IContentProposal proposal)
{
_sourceText.setText(proposal.getContent());
if (((Facet) proposal).getKey() != null)
{
if (_validationStm.getReference() == null)
{
_validationStm.setReference(new Reference());
}
_validationStm.getReference().setSourceId(new PdrId(((Facet) proposal).getKey()));
_decoValId.setImage(null);
contentChanged();
}
}
});
// }
// catch (org.eclipse.jface.bindings.keys.ParseException e1)
// {
//
// e1.printStackTrace();
// }
}
@Override
public void focusLost(final FocusEvent e)
{
if (_sourceText.getText() != null && _sourceText.getText().trim().length() == 23)
{
PdrId id = new PdrId(_sourceText.getText());
PdrObject o = _facade.getPdrObject(id);
if (o != null)
{
_validationStm.getReference().setSourceId(id);
_decoValId.setImage(null);
}
}
if (_validationStm.getReference().getSourceId() != null)
{
if (_facade.getReference(_validationStm.getReference().getSourceId()) != null)
{
_decoValId.setDescriptionText("");
_decoValId.setImage(null);
}
else
{
_decoValId.setImage(FieldDecorationRegistry.getDefault()
.getFieldDecoration(FieldDecorationRegistry.DEC_ERROR).getImage());
_decoValId.setDescriptionText(NLMessages.getString("Editor_missing_object_no_relation"));
}
}
if (_validationStm.getReference().getQuality() == null)
{
_validationStm.getReference().setQuality("certain");
}
contentChanged();
}
});
_sourceText.addKeyListener(new KeyListener()
{
@Override
public void keyPressed(final KeyEvent e)
{
}
@Override
public void keyReleased(final KeyEvent e)
{
if (_sourceText.getText().length() == 23)
{
PdrObject o = _facade.getReference(new PdrId(_sourceText.getText()));
if (o != null)
{
_decoValId.setImage(null);
_validationStm.getReference().setSourceId(new PdrId(_sourceText.getText()));
_sourceText.setText(o.getDisplayNameWithID());
}
else
{
_validationStm.getReference().setSourceId(null);
_decoValId.setImage(FieldDecorationRegistry.getDefault()
.getFieldDecoration(FieldDecorationRegistry.DEC_ERROR).getImage());
}
}
else if (_sourceText.getText().trim().length() == 0)
{
_validationStm.getReference().setSourceId(null);
_decoValId.setImage(FieldDecorationRegistry.getDefault()
.getFieldDecoration(FieldDecorationRegistry.DEC_ERROR).getImage());
}
contentChanged();
}
});
_decoValId = new ControlDecoration(_sourceText, SWT.LEFT | SWT.TOP);
_searchButton = new Button(_composite, SWT.NONE);
_searchButton.setToolTipText(NLMessages.getString("Editor_linkWithSource"));
_searchButton.setImage(_imageReg.get(IconsInternal.SEARCH));
_searchButton.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(final SelectionEvent event)
{
IWorkbench workbench = PlatformUI.getWorkbench();
Display display = workbench.getDisplay();
Shell shell = new Shell(display);
SelectObjectDialog dialog = new SelectObjectDialog(shell, 2);
dialog.open();
if (_facade.getRequestedId() != null)
{
_validationStm.getReference().setSourceId(_facade.getRequestedId());
if (_validationStm.getReference().isValidId())
{
_decoValId.setImage(null);
PdrObject o = _facade.getReference(_validationStm.getReference().getSourceId());
if (o != null)
{
_sourceText.setText(o.getDisplayNameWithID()); //$NON-NLS-1$
}
}
}
else
{
if (!_validationStm.getReference().isValidId())
{
_decoValId.setImage(FieldDecorationRegistry.getDefault()
.getFieldDecoration(FieldDecorationRegistry.DEC_ERROR).getImage());
_sourceText.setText("");
}
}
contentChanged();
}
});
_editRefButton = new Button(_composite, SWT.PUSH);
_editRefButton.setImage(_imageReg.get(IconsInternal.REFERENCE_EDIT));
_editRefButton.setLayoutData(new GridData());
_editRefButton.setToolTipText(NLMessages.getString("Editor_edit_reference_tooltip")); //$NON-NLS-1$
_editRefButton.pack();
_editRefButton.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(final SelectionEvent event)
{
if (_validationStm.getReference() != null && _validationStm.getReference().getSourceId() != null)
{
ReferenceMods ref = _facade.getReference(_validationStm.getReference().getSourceId());
if (ref != null)
{
_facade.setCurrentReference(ref);
IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
.getService(IHandlerService.class);
try
{
handlerService.executeCommand(
"org.bbaw.pdr.ae.view.main.commands.OpenSourceEditorDialog", null); //$NON-NLS-1$
}
catch (ExecutionException e)
{
e.printStackTrace();
}
catch (NotDefinedException e)
{
e.printStackTrace();
}
catch (NotEnabledException e)
{
e.printStackTrace();
}
catch (NotHandledException e)
{
e.printStackTrace();
}
}
}
}
});
_newButton = new Button(_composite, SWT.NONE);
_newButton.setToolTipText(NLMessages.getString("Editor_create_new_ref_tip"));
_newButton.setImage(_imageReg.get(IconsInternal.REFERENCE_NEW));
_newButton.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(final SelectionEvent event)
{
Event ee = new Event();
ee.widget = ValidationEditorLine.this;
SelectionEvent se = new SelectionEvent(ee);
for (SelectionListener s : _selectionListener)
{
s.widgetSelected(se);
}
IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(
IHandlerService.class);
try
{
handlerService.executeCommand("org.bbaw.pdr.ae.view.main.commands.NewReference", null); //$NON-NLS-1$
}
catch (ExecutionException e)
{
e.printStackTrace();
}
catch (NotDefinedException e)
{
e.printStackTrace();
}
catch (NotEnabledException e)
{
e.printStackTrace();
}
catch (NotHandledException e)
{
e.printStackTrace();
}
if (_facade.getCurrentReference() != null)
{
_validationStm.getReference().setSourceId(_facade.getCurrentReference().getPdrId());
_sourceText.setText(_facade.getReference(_validationStm.getReference().getSourceId())
.getDisplayNameWithID()); //$NON-NLS-1$
}
if (_validationStm.getReference().isValidId())
{
_decoValId.setImage(null);
}
else
{
_decoValId.setImage(FieldDecorationRegistry.getDefault()
.getFieldDecoration(FieldDecorationRegistry.DEC_ERROR).getImage());
}
contentChanged();
}
});
_labelInternal = new Label(_composite, SWT.NONE);
_labelInternal.setText(NLMessages.getString("Editor_internal"));
_labelInternal.setLayoutData(new GridData());
((GridData) _labelInternal.getLayoutData()).horizontalSpan = 1;
((GridData) _labelInternal.getLayoutData()).horizontalAlignment = SWT.RIGHT;
_sourcePageText = new Text(_composite, SWT.BORDER);
_sourcePageText.setLayoutData(new GridData());
((GridData) _sourcePageText.getLayoutData()).horizontalSpan = 3;
((GridData) _sourcePageText.getLayoutData()).horizontalAlignment = SWT.FILL;
((GridData) _sourcePageText.getLayoutData()).grabExcessHorizontalSpace = true;
_sourcePageText.addFocusListener(new FocusListener()
{
@Override
public void focusGained(final FocusEvent e)
{
Event ee = new Event();
ee.widget = ValidationEditorLine.this;
SelectionEvent se = new SelectionEvent(ee);
for (SelectionListener s : _selectionListener)
{
s.widgetSelected(se);
}
String[] vals = new String[]
{"test"};
try
{
vals = _facade.getMainSearcher().getFacets("validation", "internal", null, null, //$NON-NLS-1$
null);
}
catch (Exception e1)
{
e1.printStackTrace();
}
new AutoCompleteField(_sourcePageText, new TextContentAdapter(), vals);
}
@Override
public void focusLost(FocusEvent e)
{
if (_sourcePageText.getText() != null && _sourcePageText.getText().trim().length() > 0)
{
_validationStm.getReference().setInternal(_sourcePageText.getText());
}
contentChanged();
}
});
}
public ValidationStm getValidationStm()
{
return _validationStm;
}
@Override
public boolean isDirty()
{
return _isDirty;
}
@Override
public boolean isValid()
{
return (_validationStm.isValid());
}
private void loadValidation()
{
if (_validationStm.getReference() != null)
{
if (_validationStm.getReference().getSourceId() != null)
{
PdrObject o = _facade.getPdrObject(_validationStm.getReference().getSourceId());
if (o != null)
{
_sourceText.setText(o.getDisplayName());
_decoValId.setImage(null);
}
else
{
_sourceText.setText(_validationStm.getReference().getSourceId().toString());
_decoValId.setImage(FieldDecorationRegistry.getDefault()
.getFieldDecoration(FieldDecorationRegistry.DEC_ERROR).getImage());
_decoValId.setDescriptionText(NLMessages.getString("Editor_missing_object_no_relation"));
}
}
if (_validationStm.getReference().getInternal() != null)
{
_sourcePageText.setText(_validationStm.getReference().getInternal());
}
}
else
{
_sourceText.setText("");
_decoValId.setImage(FieldDecorationRegistry.getDefault()
.getFieldDecoration(FieldDecorationRegistry.DEC_REQUIRED).getImage());
}
}
@Override
public void setBackground(Color color)
{
if (!super.isDisposed())
{
super.setBackground(color);
_composite.setBackground(color);
if (_showLabel)
{
_labelSource.setBackground(color);
}
_labelInternal.setBackground(color);
}
}
@Override
public void setDirty(boolean isDirty)
{
this._isDirty = isDirty;
if (_isDirty && _parentEditor != null)
{
_parentEditor.setDirty(isDirty);
}
}
@Override
public void setForeground(Color color)
{
super.setForeground(color);
if (_showLabel)
{
_labelSource.setForeground(color);
}
_labelInternal.setForeground(color);
_sourceText.setForeground(color);
_sourcePageText.setForeground(color);
}
@Override
public void setLayoutData(Object layoutData)
{
super.setLayoutData(layoutData);
// if (_composite != null) {
// _composite.setLayoutData(layoutData);
// }
}
@Override
public void setSelected(boolean isSelected, boolean contextIsValid)
{
this._selected = isSelected;
_sourceText.setEditable(_selected && _editable);
_sourcePageText.setEditable(_selected && _editable);
_newButton.setEnabled(isSelected && _editable);
_searchButton.setEnabled(isSelected && _editable);
_editRefButton.setEnabled(isSelected && _editable);
if (isSelected && contextIsValid)
{
setBackground(AEVIEWConstants.VIEW_BACKGROUND_SELECTED_COLOR);
setForeground(AEVIEWConstants.VIEW_FOREGROUND_SELECTED_COLOR);
}
else if (contextIsValid)
{
setBackground(AEVIEWConstants.VIEW_BACKGROUND_DESELECTED_COLOR);
setForeground(AEVIEWConstants.VIEW_FOREGROUND_DESELECTED_COLOR);
}
else if (isSelected)
{
setBackground(AEVIEWConstants.VIEW_BACKGROUND_INVALID_COLOR);
setForeground(AEVIEWConstants.VIEW_FOREGROUND_SELECTED_COLOR);
}
else
{
setForeground(AEVIEWConstants.VIEW_FOREGROUND_DESELECTED_COLOR);
setBackground(AEVIEWConstants.VIEW_BACKGROUND_INVALID_COLOR);
}
}
private void contentChanged()
{
setDirty(true);
saveInput();
validateInternal();
validate();
}
private void validateInternal() {
setValid(_validationStm.isValid());
}
private void setValid(boolean isValid)
{
this._isValid = isValid;
}
private void setValidationQuality()
{
if (_validationStm != null
&& _validationStm.getReference() != null
&& (_validationStm.getReference().getQuality() == null
|| !(_validationStm.getReference().getQuality().equals("certain")
|| _validationStm.getReference().getQuality().equals("probable") || _validationStm
.getReference().getQuality().equals("unsure"))))
{
_validationStm.getReference().setQuality("certain");
}
}
public void setInput(Object input)
{
if (input instanceof ValidationStm)
{
this._validationStm = (ValidationStm) input;
setValidationQuality();
loadValidation();
}
}
@Override
public void validate()
{
if (_parentEditor != null)
{
_parentEditor.validate();
}
}
@Override
public void saveInput()
{
// TODO Auto-generated method stub
}
@Override
public void setEditable(boolean editable) {
this._editable = editable;
_sourceText.setEditable(_selected && _editable);
_sourcePageText.setEditable(_selected && _editable);
_newButton.setEnabled(_selected && editable);
_searchButton.setEnabled(_selected && editable);
_editRefButton.setEnabled(_selected && editable);
}
}