/*******************************************************************************
* Copyright (c) 2011 Bundlemaker project team.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Kai Lehmann - initial API and implementation
* Bundlemaker project team - integration with BundleMaker Analysis UI
******************************************************************************/
package org.bundlemaker.core.ui.editor.dsm;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.bundlemaker.core.analysis.IBundleMakerArtifact;
import org.bundlemaker.core.analysis.IDependency;
import org.bundlemaker.core.selection.IArtifactSelection;
import org.bundlemaker.core.selection.Selection;
import org.bundlemaker.core.ui.editor.dsm.widget.DsmViewWidget;
import org.bundlemaker.core.ui.editor.dsm.widget.IDsmContentProvider;
import org.bundlemaker.core.ui.editor.dsm.widget.IMatrixListener;
import org.bundlemaker.core.ui.editor.dsm.widget.MatrixEvent;
import org.bundlemaker.core.ui.event.selection.workbench.editor.AbstractArtifactSelectionAwareEditorPart;
import org.bundlemaker.core.ui.utils.EditorHelper;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.internal.part.NullEditorInput;
/**
* <p>
* </p>
*
* @author Gerd Wütherich (gerd@gerd-wuetherich.de)
*/
@SuppressWarnings("restriction")
public class DSMArtifactModelEditor extends AbstractArtifactSelectionAwareEditorPart {
/**
* This is used as the DSMView's providerId for the xxxSelectionServices
*/
public static String DSM_EDITOR_ID = DSMArtifactModelEditor.class.getName();
/**
* Dummy input used for this editor
*/
private static IEditorInput nullInputEditor = new NullEditorInput();
/** - */
private DsmViewWidget _viewWidget;
/** - */
private DsmDetailComposite _detailComposite;
/** - */
private int[] _selectedCell;
/** - */
private IBundleMakerArtifact _fromArtifact;
/** - */
private IBundleMakerArtifact _toArtifact;
/** - */
private DefaultArtifactLabelProvider _artifactLabelProvider;
/** - */
private IDsmContentProvider _dsmContentProvider;
/**
* Opens the DSM View.
*
* <p>
* This method does nothing in case the DSM view could not be opened for any reason.
*
*/
public static void openDsmView() {
EditorHelper.openEditor(DSM_EDITOR_ID, nullInputEditor);
}
/**
* {@inheritDoc}
*/
@Override
public void analysisModelModified() {
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
initSelection(getCurrentArtifactSelection());
}
});
}
/**
* {@inheritDoc}
*/
@Override
public void createPartControl(Composite parent) {
//
GridLayout gridLayout = new GridLayout(1, true);
parent.setLayout(gridLayout);
//
_dsmContentProvider = new DefaultBundleMakerArtifactDsmContentProvider();
_artifactLabelProvider = new DefaultArtifactLabelProvider();
_viewWidget = new DsmViewWidget(_dsmContentProvider, _artifactLabelProvider, new DefaultDependencyLabelProvider(),
parent);
GridDataFactory.swtDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(_viewWidget);
_viewWidget.setZoom((50 + 10) * 0.02f);
//
_detailComposite = new DsmDetailComposite(parent, _viewWidget);
_detailComposite.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
initSelection(getCurrentArtifactSelection());
}
});
GridDataFactory.swtDefaults().grab(true, false).align(SWT.FILL, SWT.CENTER).applyTo(_detailComposite);
setDefaultDependencyDescription();
//
_viewWidget.addMatrixListener(new IMatrixListener.Adapter() {
@Override
public void marked(MatrixEvent event) {
//
if (isCellSelected(event)) {
_detailComposite.getSelectionCountLabel().setText(
getNullSafeString(_viewWidget.getDependenciesAsStrings()[event.getX()][event.getY()], "0"));
_detailComposite.getFromLabel().setText(
((IBundleMakerArtifact) _dsmContentProvider.getNodes()[event.getY()]).getQualifiedName());
_detailComposite.getToLabel().setText(
((IBundleMakerArtifact) _dsmContentProvider.getNodes()[event.getX()]).getQualifiedName());
}
//
else if (_selectedCell != null) {
_detailComposite.getSelectionCountLabel().setText(
getNullSafeString(_viewWidget.getDependenciesAsStrings()[_selectedCell[0]][_selectedCell[1]], "0"));
_detailComposite.getFromLabel().setText(
((IBundleMakerArtifact) _dsmContentProvider.getNodes()[_selectedCell[1]]).getQualifiedName());
_detailComposite.getToLabel().setText(
((IBundleMakerArtifact) _dsmContentProvider.getNodes()[_selectedCell[0]]).getQualifiedName());
}
//
else {
setDefaultDependencyDescription();
}
}
/**
* {@inheritDoc}
*/
@Override
public void singleClick(MatrixEvent event) {
if (isCellSelected(event)) {
_selectedCell = new int[] { event.getX(), event.getY() };
IDependency dependency = (IDependency) _dsmContentProvider.getDependency(event.getX(), event.getY());
Selection.instance().getDependencySelectionService()
.setSelection(Selection.MAIN_DEPENDENCY_SELECTION_ID, DSMArtifactModelEditor.DSM_EDITOR_ID, dependency);
_fromArtifact = (IBundleMakerArtifact) _dsmContentProvider.getNodes()[event.getX()];
_toArtifact = (IBundleMakerArtifact) _dsmContentProvider.getNodes()[event.getY()];
}
}
});
// create the context menu
// createContextMenu(_viewWidget);
//
setCurrentArtifactSelection(getCurrentArtifactSelection());
}
/**
* {@inheritDoc}
*/
@Override
public void setFocus() {
//
}
protected String getNullSafeString(String string, String defaultValue) {
return string == null ? defaultValue : string;
}
/**
* {@inheritDoc}
*/
@Override
public void setCurrentArtifactSelection(IArtifactSelection selection) {
//
if (selection.getProviderId().equals(DSM_EDITOR_ID)) {
return;
}
super.setCurrentArtifactSelection(selection);
initSelection(selection);
}
private void initSelection(IArtifactSelection selection) {
if (_viewWidget != null && _detailComposite != null) {
//
_dsmContentProvider = new DefaultBundleMakerArtifactDsmContentProvider(selection.getEffectiveSelectedArtifacts());
_artifactLabelProvider.setLabelPresentationMode(_detailComposite.getLabelPresentationMode());
_viewWidget.setModel(_dsmContentProvider);
// clear the dependency selection
resetDependencySelection();
setDefaultDependencyDescription();
}
}
/**
* {@inheritDoc}
*/
@Override
public void dispose() {
clearDependencySelection();
super.dispose();
}
/**
* <p>
* </p>
*/
private void clearDependencySelection() {
_selectedCell = null;
List<IDependency> dependencies = Collections.emptyList();
Selection.instance().getDependencySelectionService()
.setSelection(Selection.MAIN_DEPENDENCY_SELECTION_ID, DSM_EDITOR_ID, dependencies);
}
/**
* <p>
* </p>
*
* @param list
*/
private void resetDependencySelection() {
//
List<?> artifacts = Arrays.asList(_dsmContentProvider.getNodes());
//
if (_fromArtifact == null || _toArtifact == null || !artifacts.contains(_fromArtifact)
|| !artifacts.contains(_toArtifact)) {
//
clearDependencySelection();
}
//
else {
//
_selectedCell = new int[] { artifacts.indexOf(_fromArtifact), artifacts.indexOf(_toArtifact) };
IDependency dependency = (IDependency) _dsmContentProvider.getDependency(_selectedCell[0], _selectedCell[1]);
Selection.instance().getDependencySelectionService()
.setSelection(Selection.MAIN_DEPENDENCY_SELECTION_ID, DSMArtifactModelEditor.DSM_EDITOR_ID, dependency);
}
}
/**
* {@inheritDoc}
*/
@Override
protected String getProviderId() {
return DSM_EDITOR_ID;
}
// /**
// * <p>
// * </p>
// *
// * @param dsmViewWidget
// */
// private void createContextMenu(DsmViewWidget dsmViewWidget) {
//
// MenuManager menuManager = new MenuManager("#PopupMenu");
// menuManager.setRemoveAllWhenShown(true);
// menuManager.addMenuListener(new IMenuListener() {
//
// private MenuItem _menuItem;
//
// @Override
// public void menuAboutToShow(IMenuManager manager) {
// manager.add(new Separator("edit"));
// manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
// manager.appendToGroup("edit", new ContributionItem("Test") {
//
// /**
// * {@inheritDoc}
// */
// @Override
// public void fill(Menu menu, int index) {
// _menuItem = new MenuItem(menu, SWT.PUSH);
// _menuItem.setText("Export...");
// _menuItem.addSelectionListener(new SelectionListener() {
//
// @Override
// public void widgetSelected(SelectionEvent e) {
//
// final int sideMarkerOffset = FigureUtilities.getTextWidth(
// DsmUtils.getLongestString(_viewWidget.getModel().getLabels()), Display.getCurrent().getSystemFont());
//
// //
// int matrixWidth = _viewWidget.getModel().getConfiguration().getHorizontalBoxSize()
// * _viewWidget.getModel().getItemCount();
// int matrixHeight = _viewWidget.getModel().getConfiguration().getVerticalBoxSize()
// * _viewWidget.getModel().getItemCount();
// final Matrix matrix = new Matrix(_viewWidget.getModel(), new DependencyLabelProvider(), _viewWidget
// .getModel());
// matrix.setSize(matrixWidth, matrixHeight);
// matrix.setFont(Display.getCurrent().getSystemFont());
//
// //
// final VerticalSideMarker verticalSideMarker = new VerticalSideMarker(_viewWidget.getModel());
// verticalSideMarker.setSize(sideMarkerOffset, matrixHeight);
// verticalSideMarker.setFont(Display.getCurrent().getSystemFont());
//
// //
// final HorizontalSideMarker horizontalSideMarker = new HorizontalSideMarker(_viewWidget.getModel());
// horizontalSideMarker.setSize(matrixWidth, sideMarkerOffset);
// horizontalSideMarker.setFont(Display.getCurrent().getSystemFont());
//
// IFigure mainFigure = new Figure() {
//
// /**
// * {@inheritDoc}
// */
// @Override
// public void paint(Graphics graphics) {
// super.paint(graphics);
//
// graphics.pushState();
// graphics.translate(0, sideMarkerOffset);
// verticalSideMarker.paint(graphics);
// graphics.restoreState();
//
// graphics.pushState();
// graphics.translate(sideMarkerOffset, sideMarkerOffset);
// matrix.paint(graphics);
// graphics.restoreState();
//
// graphics.pushState();
// graphics.translate(sideMarkerOffset, 0);
// horizontalSideMarker.paint(graphics);
// graphics.restoreState();
// }
// };
// mainFigure.setSize(matrix.getSize().width + sideMarkerOffset + 1, matrix.getSize().height
// + sideMarkerOffset + 1);
//
// FigurePrinter.save(mainFigure);
// }
//
// @Override
// public void widgetDefaultSelected(SelectionEvent e) {
// }
// });
// }
// });
// }
// });
//
// Menu menu = menuManager.createContextMenu(dsmViewWidget);
// dsmViewWidget.setMenu(menu);
// }
// /** Paints the figure onto the given graphics */
// public static void paintDiagram(Graphics g, IFigure figure) {
// // We want to ignore the first FreeformLayer (or we lose also all figure, as it draws the 'page boundaries'
// // which is obviously not wanted in the exported images.
// for (Object child : figure.getChildren()) {
// // ConnectionLayer inherits from FreeformLayer, so rather checking for FreeformLayer we check whether child
// // is not a ConnectionLayer!
// if (child instanceof FreeformLayer && !(child instanceof ConnectionLayer)) {
// paintDiagram(g, (IFigure) child);
// } else {
// ((IFigure) child).paint(g);
// }
// }
// }
/**
* <p>
* </p>
*
* @param event
* @return
*/
private boolean isCellSelected(MatrixEvent event) {
return event.getX() <= _dsmContentProvider.getItemCount() && event.getX() >= 0
&& event.getY() <= _dsmContentProvider.getItemCount() && event.getY() >= 0;
}
/**
* <p>
* </p>
*
*/
private void setDefaultDependencyDescription() {
_detailComposite.getSelectionCountLabel().setText("0");
_detailComposite.getFromLabel().setText("-");
_detailComposite.getToLabel().setText("-");
}
}