/**
* 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.markup.web;
import java.util.ArrayList;
import org.bbaw.pdr.ae.common.NLMessages;
import org.bbaw.pdr.ae.model.ReferenceMods;
import org.bbaw.pdr.ae.view.control.interfaces.IReferencePresentation;
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.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
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.Event;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.IHandlerService;
/**
* The Class ReferencePresentationWeb.
* @author Christoph Plutte
*/
public class ReferencePresentationWeb implements IReferencePresentation
{
/** The _reference. */
private ReferenceMods _reference;
private Composite _parentComposite;
/** The _text composite. */
private Composite _textComposite;
/** The _selected. */
private boolean _selected;
/** The _stext. */
private Text _stext;
/** The references selection adapter. */
private SelectionAdapter _referencesSelectionAdapter;
/** Resource Manager for colors and fonts. */
private static LocalResourceManager resources = new LocalResourceManager(JFaceResources.getResources());
/** The COLO r_ white. */
private static final Color COLOR_WHITE = resources.createColor(new RGB(255, 255, 255));
/** The COLO r_ selected. */
private static final Color COLOR_SELECTED = resources.createColor(new RGB(255, 255, 200));
/** The _selection listener. */
private ArrayList<Listener> _selectionListener = new ArrayList<Listener>();
/** The _double click listener. */
private ArrayList<Listener> _doubleClickListener = new ArrayList<Listener>();
@Override
public void addDoubleClickListener(final Listener listener)
{
if (listener != null)
{
_doubleClickListener.add(listener);
}
}
@Override
public void addSelectionListener(final Listener listener)
{
if (listener != null)
{
_selectionListener.add(listener);
}
}
/**
* Creates the additional references selection adapter.
*/
private void createAdditionalReferencesSelectionAdapter()
{
_referencesSelectionAdapter = new SelectionAdapter()
{
@Override
public void widgetSelected(final SelectionEvent ev)
{
// System.out.println("Selection: " + ev.text); //$NON-NLS-1$
Event se = new Event();
se.data = ReferencePresentationWeb.this;
for (Listener s : _selectionListener)
{
s.handleEvent(se);
}
Link button = (Link) ev.getSource();
Event event = new Event();
event.data = button.getData();
IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(
IHandlerService.class);
try
{
handlerService.executeCommand(
"org.bbaw.pdr.ae.view.main.commands.OpenAdditionalReferencesView", event); //$NON-NLS-1$
}
catch (ExecutionException e)
{
e.printStackTrace();
}
catch (NotDefinedException e)
{
e.printStackTrace();
}
catch (NotEnabledException e)
{
e.printStackTrace();
}
catch (NotHandledException e)
{
e.printStackTrace();
}
}
};
}
@Override
public final void createPresentation()
{
loadReference();
setSelected(false);
}
@Override
public Control getControl()
{
return _stext;
}
@Override
public final ReferenceMods getReference()
{
return _reference;
}
/**
* Load reference.
*/
private void loadReference()
{
_textComposite = new Composite(_parentComposite, SWT.BORDER);
_textComposite.setLayout(new GridLayout(1, true));
((GridLayout) _textComposite.getLayout()).verticalSpacing = 0;
((GridLayout) _textComposite.getLayout()).marginHeight = 0;
GridData gd = new GridData();
gd.grabExcessHorizontalSpace = true;
gd.horizontalAlignment = GridData.FILL;
gd.widthHint = 200;
_textComposite.setLayoutData(gd);
// System.out.println( event + category + position);
createAdditionalReferencesSelectionAdapter();
final ArrayList<Control> controls = new ArrayList<Control>();
_stext = new Text(_textComposite, SWT.WRAP | SWT.NO_BACKGROUND | SWT.NO_FOCUS | SWT.CURSOR_ARROW );
_stext.setEditable(false);
_stext.setData("key", _reference.getPdrId().toString()); //$NON-NLS-1$
_stext.setData("id", _reference.getPdrId().toString()); //$NON-NLS-1$
_stext.setData("textOffset", 0); //$NON-NLS-1$
// System.out.println("stext data cat: " + stext.getData("category")
// + " position " + stext.getData("position")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
// IStatus slaCaret = new Status(IStatus.INFO,Activator.PLUGIN_ID,
// "ReferenceCatView load aspect - stext caret offset: " + _stext.getCaretOffset()); //$NON-NLS-1$
// iLogger.log(slaCaret);
_stext.addMouseListener(new MouseAdapter()
{
@Override
public void mouseDoubleClick(final MouseEvent me)
{
Event se = new Event();
se.data = ReferencePresentationWeb.this;
for (Listener s : _doubleClickListener)
{
s.handleEvent(se);
}
}
@Override
public void mouseDown(final MouseEvent e)
{
Event se = new Event();
se.data = ReferencePresentationWeb.this;
for (Listener s : _selectionListener)
{
s.handleEvent(se);
}
}
});
_textComposite.addMouseListener(new MouseAdapter()
{
@Override
public void mouseDoubleClick(final MouseEvent me)
{
Event se = new Event();
se.data = ReferencePresentationWeb.this;
for (Listener s : _doubleClickListener)
{
s.handleEvent(se);
}
}
@Override
public void mouseDown(final MouseEvent e)
{
Event se = new Event();
se.data = ReferencePresentationWeb.this;
for (Listener s : _selectionListener)
{
s.handleEvent(se);
}
}
});
_stext.append("\n"); //$NON-NLS-1$
_stext.append(_reference.getDisplayNameLong());
Link rLink = new Link(_textComposite, SWT.PUSH);
rLink.addSelectionListener(_referencesSelectionAdapter);
rLink.setData(_reference.getPdrId().toString());
rLink.setBackground(COLOR_WHITE);
rLink.setText("<a href=\"native\">" + _reference.getPdrId().toString() + "</a>"); //$NON-NLS-1$ //$NON-NLS-2$
controls.add(rLink);
if (_reference.getRecord() != null && _reference.getRecord().getRevisions() != null
&& _reference.getRecord().getRevisions().firstElement() != null
&& _reference.getRecord().getRevisions().firstElement().getAuthority() != null)
{
_stext.append(NLMessages.getString("View_lb_user")
+ _reference.getRecord().getRevisions().firstElement().getAuthority().toString());
}
_stext.append("\n"); //$NON-NLS-1$
_stext.setLayoutData(gd);
_textComposite.layout();
}
@Override
public final void setComposite(final Composite parentComposite)
{
this._parentComposite = parentComposite;
}
@Override
public final void setGrayedOut(final boolean grayedout)
{
}
@Override
public final void setReference(final ReferenceMods reference)
{
this._reference = reference;
}
@Override
public final void setSelected(final boolean seleted)
{
this._selected = seleted;
if (_stext != null)
{
if (_selected)
{
_stext.setBackground(COLOR_SELECTED);
_textComposite.setBackground(COLOR_SELECTED);
}
else
{
_stext.setBackground(COLOR_WHITE);
_textComposite.setBackground(COLOR_WHITE);
}
}
}
}