/**
* 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 org.bbaw.pdr.ae.common.AEConstants;
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.core.PDRConfigProvider;
import org.bbaw.pdr.ae.control.facade.Facade;
import org.bbaw.pdr.ae.control.facade.RightsChecker;
import org.bbaw.pdr.ae.metamodel.PdrId;
import org.bbaw.pdr.ae.model.Aspect;
import org.bbaw.pdr.ae.model.PdrObject;
import org.bbaw.pdr.ae.model.RelationStm;
import org.bbaw.pdr.ae.model.SemanticStm;
import org.bbaw.pdr.ae.model.TaggingRange;
import org.bbaw.pdr.ae.view.control.ControlExtensions;
import org.bbaw.pdr.ae.view.control.interfaces.IMarkupPresentation;
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.core.runtime.Platform;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.Policy;
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.Point;
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.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.IHandlerService;
/**
* The Class MarkupTooltip.
* @author Christoph Plutte
*/
public class AspectPresentationTooltip extends CustomTooltipMouseListener
{
/** The parent shell. */
private Shell _parentShell;
/** The image reg. */
private ImageRegistry _imageReg = CommonActivator.getDefault().getImageRegistry();
/** The Constant HEADER_BG_COLOR. */
public static final String HEADER_BG_COLOR = Policy.JFACE + ".TOOLTIP_HEAD_BG_COLOR";
/** The Constant HEADER_FG_COLOR. */
public static final String HEADER_FG_COLOR = Policy.JFACE + ".TOOLTIP_HEAD_FG_COLOR";
/** The Constant HEADER_FONT. */
public static final String HEADER_FONT = Policy.JFACE + ".TOOLTIP_HEAD_FONT";
/** The Constant HEADER_CLOSE_ICON. */
public static final String HEADER_CLOSE_ICON = Policy.JFACE + ".TOOLTIP_CLOSE_ICON";
private Composite _parentComposite;
private RightsChecker _richtsChecker = new RightsChecker();
private Aspect _aspect;
/** The _provider. */
private String _provider;
private Facade _facade = Facade.getInstanz();
private SelectionAdapter _aspectsSelectionAdapter;
public AspectPresentationTooltip(final Control control, Aspect aspect)
{
super(control);
this._parentShell = control.getShell();
this._aspect = aspect;
_provider = Platform
.getPreferencesService()
.getString(CommonActivator.PLUGIN_ID, "PRIMARY_SEMANTIC_PROVIDER",
AEConstants.CLASSIFICATION_AUTHORITY, null).toUpperCase(); //$NON-NLS-1$
createAdditionalAspectsSelectionAdapter();
}
/**
* Creates the content area.
* @param parent the parent
* @return the composite
*/
protected final Composite createContentArea(final Composite parent)
{
this._parentComposite = parent;
Composite comp = new Composite(parent, SWT.NONE);
comp.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
GridLayout layout = new GridLayout();
layout.marginWidth = 5;
comp.setLayout(layout);
final IMarkupPresentation markupPresentation = ControlExtensions.createMarkupPresentation();
if (markupPresentation != null)
{
Composite textComp = new Composite(comp, SWT.LEFT | SWT.BORDER);
textComp.setBackground(AEVIEWConstants.VIEW_BACKGROUND_DESELECTED_COLOR);
textComp.setLayoutData(new GridData());
((GridData) textComp.getLayoutData()).grabExcessHorizontalSpace = true;
((GridData) textComp.getLayoutData()).horizontalAlignment = SWT.FILL;
textComp.setLayout(new GridLayout());
((GridLayout) textComp.getLayout()).numColumns = 2;
((GridLayout) textComp.getLayout()).marginHeight = 0;
((GridLayout) textComp.getLayout()).marginWidth = 0;
markupPresentation.setAspect(_aspect);
markupPresentation.setComposite(textComp);
markupPresentation.createPresentation();
Composite rightcomp = new Composite(textComp, SWT.RIGHT | SWT.TOP);
rightcomp.setBackground(AEVIEWConstants.VIEW_BACKGROUND_DESELECTED_COLOR);
rightcomp.setLayout(new GridLayout());
((GridLayout) rightcomp.getLayout()).numColumns = 2;
rightcomp.setLayoutData(new GridData());
((GridData) rightcomp.getLayoutData()).verticalAlignment = SWT.TOP;
((GridData) rightcomp.getLayoutData()).horizontalAlignment = SWT.RIGHT;
Label blancLabel = new Label(rightcomp, SWT.NONE);
blancLabel.setText("");
blancLabel.setBackground(AEVIEWConstants.VIEW_BACKGROUND_DESELECTED_COLOR);
blancLabel.setLayoutData(new GridData());
blancLabel.pack();
final Button editButton = new Button(rightcomp, SWT.PUSH);
editButton.setImage(_imageReg.get(IconsInternal.EDIT));
editButton.setToolTipText("Aspekt in Editor bearbeiten");
editButton.setData(markupPresentation);
editButton.setEnabled((_richtsChecker.mayWrite(_aspect)));
editButton.setLayoutData(new GridData());
((GridData) editButton.getLayoutData()).verticalAlignment = SWT.TOP;
((GridData) editButton.getLayoutData()).horizontalAlignment = SWT.RIGHT;
editButton.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent se)
{
IMarkupPresentation current = (IMarkupPresentation) editButton.getData(); //$NON-NLS-1$
_facade.setCurrentAspect(current.getAspect());
IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
.getService(IHandlerService.class);
try
{
AspectPresentationTooltip.this.hide();
handlerService.executeCommand(
"org.bbaw.pdr.ae.view.main.commands.CallAspectEditor", null); //$NON-NLS-1$
}
catch (ExecutionException e)
{
e.printStackTrace();
}
catch (NotDefinedException e)
{
e.printStackTrace();
}
catch (NotEnabledException e)
{
e.printStackTrace();
}
catch (NotHandledException e)
{
e.printStackTrace();
}
}
});
editButton.pack();
for (SemanticStm sStm : _aspect.getSemanticDim().getSemanticStms())
{
Label imLabel = new Label(rightcomp, SWT.NONE);
if (sStm.getLabel().startsWith("NormName")
|| _facade.getPersonDisplayNameTags(_provider).contains(sStm.getLabel()))
{
imLabel.setImage(_imageReg.get(IconsInternal.CLASSIFICATION_NAME_NORM));
}
else if (sStm.getLabel().equals("Name")
|| _facade.getPersonNameTags(_provider).contains(sStm.getLabel()))
{
imLabel.setImage(_imageReg.get(IconsInternal.CLASSIFICATION_NAME));
}
else
{
imLabel.setImage(_imageReg.get(IconsInternal.CLASSIFICATION));
}
imLabel.setLayoutData(new GridData());
imLabel.pack();
Label semantic = new Label(rightcomp, SWT.NONE);
semantic.setText(PDRConfigProvider.getSemanticLabel(sStm.getProvider(), sStm.getLabel()));
semantic.setBackground(AEVIEWConstants.VIEW_BACKGROUND_DESELECTED_COLOR);
semantic.setLayoutData(new GridData());
semantic.pack();
}
for (RelationStm rStm : _aspect.getRelationDim().getRelationStms())
{
if (rStm.getSubject().equals(_aspect.getPdrId()) && rStm.getRelations() != null
&& rStm.getRelations().firstElement() != null
&& rStm.getRelations().firstElement().getObject() != null)
{
Label imLabel = new Label(rightcomp, SWT.NONE);
imLabel.setToolTipText(NLMessages.getString("View_message_aspect_belongsto"));
final String id = rStm.getRelations().firstElement().getObject().toString();
String name = id;
PdrObject obj = _facade.getPdrObject(new PdrId(id));
if (obj != null)
{
name = obj.getDisplayName();
if (id.startsWith("pdrPo")) //$NON-NLS-1$
{
imLabel.setImage(_imageReg.get(IconsInternal.PERSON));
}
if (id.startsWith("pdrAo")) //$NON-NLS-1$
{
imLabel.setImage(_imageReg.get(IconsInternal.ASPECT));
}
if (id.startsWith("pdrRo")) //$NON-NLS-1$
{
imLabel.setImage(_imageReg.get(IconsInternal.REFERENCE));
}
}
imLabel.setLayoutData(new GridData());
imLabel.pack();
Link person = new Link(rightcomp, SWT.NONE);
person.addSelectionListener(_aspectsSelectionAdapter);
person.setText("<a href=\"native\">" + name + "</a>");
person.setData(id);
person.setBackground(AEVIEWConstants.VIEW_BACKGROUND_DESELECTED_COLOR);
person.setLayoutData(new GridData());
person.pack();
}
}
final MarkupTooltip markupTooltipLabel = new MarkupTooltip(textComp);
markupTooltipLabel.setPopupDelay(0);
markupTooltipLabel.setHideOnMouseDown(true);
markupTooltipLabel.deactivate();
markupPresentation.addMarkupSelectionListener(new Listener()
{
@Override
public void handleEvent(final Event event)
{
TaggingRange tr = (TaggingRange) event.data;
if (tr != null)
{
String message;
if (!tr.getName().equals("date")) //$NON-NLS-1$
{
message = NLMessages.getString("View_markupName")
+ PDRConfigProvider.getLabelOfMarkup(tr.getName(), null, null, null) + "\n"; //$NON-NLS-1$//$NON-NLS-2$
if (tr.getType() != null)
{
message = message + NLMessages.getString("View_type")
+ PDRConfigProvider.getLabelOfMarkup(tr.getName(), tr.getType(), null, null)
+ "\n"; //$NON-NLS-1$//$NON-NLS-2$
}
if (tr.getSubtype() != null && tr.getSubtype().trim().length() > 0)
{
message = message
+ NLMessages.getString("View_subtype")
+ PDRConfigProvider.getLabelOfMarkup(tr.getName(), tr.getType(),
tr.getSubtype(),
null) + "\n"; //$NON-NLS-1$//$NON-NLS-2$
}
if (tr.getRole() != null && tr.getRole().trim().length() > 0)
{
message = message
+ NLMessages.getString("View_role")
+ PDRConfigProvider.getLabelOfMarkup(tr.getName(), tr.getType(),
tr.getSubtype(),
tr.getRole()) + "\n"; //$NON-NLS-1$//$NON-NLS-2$
}
if (tr.getKey() != null && tr.getKey().trim().length() > 0)
{
message = message + NLMessages.getString("View_key") + tr.getKey(); //$NON-NLS-1$
PdrObject o = _facade.getPdrObject(new PdrId(tr.getKey()));
if (o != null)
{
message = message + " " + o.getDisplayName(); //$NON-NLS-1$
}
else
{
message = message + NLMessages.getString("View_message_missing_dataObject");
}
}
if (tr.getAna() != null && tr.getAna().trim().length() > 0)
{
message = message + "\n" + NLMessages.getString("View_lb_lb_owner");
PdrObject o = _facade.getPdrObject(new PdrId(tr.getAna()));
if (o != null)
{
message = message + " " + o.getDisplayNameWithID(); //$NON-NLS-1$
}
else
{
message = message + NLMessages.getString("View_message_missing_dataObject");
}
}
message = message + "\n" + NLMessages.getString("View_lb_content") + tr.getTextValue();
}
else if (tr.getName().equals("date")) //$NON-NLS-1$
{
message = NLMessages.getString("View_MarkupDate")
+ PDRConfigProvider.getLabelOfMarkup(tr.getName(), null, null, null) + "\n"; //$NON-NLS-1$//$NON-NLS-2$
if (tr.getType() != null)
{
message = message + NLMessages.getString("View_type")
+ PDRConfigProvider.getLabelOfMarkup(tr.getName(), tr.getType(), null, null)
+ "\n"; //$NON-NLS-1$//$NON-NLS-2$
}
if (tr.getSubtype() != null && tr.getSubtype().trim().length() > 0)
{
message = message
+ NLMessages.getString("View_subtype")
+ PDRConfigProvider.getLabelOfMarkup(tr.getName(), tr.getType(),
tr.getSubtype(),
null) + "\n"; //$NON-NLS-1$//$NON-NLS-2$
}
if (tr.getWhen() != null)
{
message = message + NLMessages.getString("View_when") + tr.getWhen().toString(); //$NON-NLS-1$
}
if (tr.getFrom() != null)
{
message = message + NLMessages.getString("View_from") + tr.getFrom().toString(); //$NON-NLS-1$
}
if (tr.getTo() != null)
{
message = message + "\n" + NLMessages.getString("View_to") + tr.getTo().toString(); //$NON-NLS-1$
}
if (tr.getNotBefore() != null)
{
message = message
+ NLMessages.getString("View_notBefore") + tr.getNotBefore().toString(); //$NON-NLS-1$
}
if (tr.getNotAfter() != null)
{
message = message
+ "\n" + NLMessages.getString("View_NotAfter") + tr.getNotAfter().toString(); //$NON-NLS-1$
}
if (tr.getAna() != null && tr.getAna().trim().length() > 0)
{
message = message + "\n" + NLMessages.getString("View_lb_lb_owner");
PdrObject o = _facade.getPdrObject(new PdrId(tr.getAna()));
if (o != null)
{
message = message + " " + o.getDisplayNameWithID(); //$NON-NLS-1$
}
else
{
message = message + NLMessages.getString("View_message_missing_dataObject");
}
}
message = message + "\n" + NLMessages.getString("View_lb_content") + tr.getTextValue();
}
else
{
message = NLMessages.getString("View_errorMarkupInfo"); //$NON-NLS-1$
}
// MessageDialog.openInformation(parentShell, "", message); //$NON-NLS-1$
// break;
// System.out.println("open message " + message);
markupTooltipLabel.setToolTipText(message);
// FIXME erneuern.
markupTooltipLabel.activate();
markupTooltipLabel.show(new Point(event.x + 5, event.y + 10));
}
else
{
markupTooltipLabel.hide();
}
}
});
rightcomp.layout();
rightcomp.pack();
// Point p = _text.computeSize(250, SWT.DEFAULT);
// _text.setSize(p);
// _text.setLayoutData(new GridData(p.x, p.y));
// // _text.redraw();
// // _text.update();
// _text.pack(true);
}
return comp;
}
/**
* Creates the additional aspects selection adapter.
*/
private void createAdditionalAspectsSelectionAdapter()
{
_aspectsSelectionAdapter = new SelectionAdapter()
{
@Override
public void widgetSelected(final SelectionEvent ev)
{
// System.out.println("Selection: " + ev.text); //$NON-NLS-1$
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.OpenAdditionalAspectsView", 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
protected final Composite createToolTipContentArea(final Event event, final Composite parent)
{
Composite comp = new Composite(parent, SWT.NONE);
GridLayout gl = new GridLayout(1, false);
gl.marginBottom = 0;
gl.marginTop = 0;
gl.marginHeight = 0;
gl.marginWidth = 0;
gl.marginLeft = 0;
gl.marginRight = 0;
gl.verticalSpacing = 1;
comp.setLayout(gl);
Composite topArea = new Composite(comp, SWT.NONE);
GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
data.widthHint = 200;
topArea.setLayoutData(data);
topArea.setBackground(JFaceResources.getColorRegistry().get(HEADER_BG_COLOR));
gl = new GridLayout(2, false);
gl.marginBottom = 2;
gl.marginTop = 2;
gl.marginHeight = 0;
gl.marginWidth = 0;
gl.marginLeft = 5;
gl.marginRight = 2;
topArea.setLayout(gl);
Label l = new Label(topArea, SWT.NONE);
l.setText(_aspect.getDisplayNameWithID());
l.setBackground(JFaceResources.getColorRegistry().get(HEADER_BG_COLOR));
l.setFont(JFaceResources.getFontRegistry().get(HEADER_FONT));
l.setForeground(JFaceResources.getColorRegistry().get(HEADER_FG_COLOR));
l.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite iconComp = new Composite(topArea, SWT.NONE);
iconComp.setLayoutData(new GridData());
iconComp.setLayout(new GridLayout(2, false));
iconComp.setBackground(JFaceResources.getColorRegistry().get(HEADER_BG_COLOR));
gl = new GridLayout(2, false);
gl.marginBottom = 0;
gl.marginTop = 0;
gl.marginHeight = 0;
gl.marginWidth = 0;
gl.marginLeft = 0;
gl.marginRight = 0;
iconComp.setLayout(gl);
Label helpIcon = new Label(iconComp, SWT.NONE);
helpIcon.setBackground(JFaceResources.getColorRegistry().get(HEADER_BG_COLOR));
helpIcon.setImage(_imageReg.get(IconsInternal.CANCEL));
helpIcon.addMouseListener(new MouseAdapter()
{
@Override
public void mouseDown(final MouseEvent e)
{
hide();
// MarkupTooltip.this.dispose();
openHelp();
}
});
Label closeIcon = new Label(iconComp, SWT.NONE);
closeIcon.setBackground(JFaceResources.getColorRegistry().get(HEADER_BG_COLOR));
closeIcon.setImage(JFaceResources.getImage(HEADER_CLOSE_ICON));
closeIcon.addMouseListener(new MouseAdapter()
{
@Override
public void mouseDown(final MouseEvent e)
{
_parentShell.setFocus();
hide();
// MarkupTooltip.this.dispose();
}
});
createContentArea(comp).setLayoutData(new GridData(GridData.FILL_BOTH));
return comp;
}
/**
* Open help.
*/
protected void openHelp()
{
// parentShell.setFocus();
//
// MessageBox box = new MessageBox(parentShell,SWT.ICON_INFORMATION);
// box.setText("Info");
// box.setMessage("Here is where we'd show some information.");
// box.open();
}
/**
* Open url.
*/
protected void openURL()
{
// MessageBox box = new MessageBox(parentShell,SWT.ICON_INFORMATION);
// box.setText("Eclipse.org");
// box.setMessage("Here is where we'd open the URL.");
// box.open();
}
}