blob: 300190258851089fcd1d18f38577ca61f2a34181 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2008 Oracle. 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: Oracle. - initial API and implementation
*******************************************************************************/
package org.eclipse.jpt.ui.internal.views;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jpt.core.JpaStructureNode;
import org.eclipse.jpt.ui.JpaPlatformUi;
import org.eclipse.jpt.ui.JptUiPlugin;
import org.eclipse.jpt.ui.details.JpaDetailsPage;
import org.eclipse.jpt.ui.details.JpaDetailsProvider;
import org.eclipse.jpt.ui.internal.JptUiMessages;
import org.eclipse.jpt.ui.internal.Tracing;
import org.eclipse.jpt.ui.internal.platform.JpaPlatformUiRegistry;
import org.eclipse.jpt.ui.internal.selection.JpaSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
/**
* The JPA view that shows the details a mapping (either type or attribute).
*
* @version 2.0
* @since 1.0
*/
@SuppressWarnings("nls")
public class JpaDetailsView extends AbstractJpaView
{
/**
* The current <code>IJpaDetailsPage</code> that was retrieve based on the
* current selection.
*/
private JpaDetailsPage<JpaStructureNode> currentPage;
/**
* The current selection used to show the right <code>IJpaDetailsPage</code>.
*/
private JpaSelection currentSelection;
/**
* key: Object content node id, value: Composite page.
*/
private Map<Object, JpaDetailsPage<? extends JpaStructureNode>> detailsPages;
/**
* Creates a new <code>JpaDetailsView</code>.
*/
public JpaDetailsView() {
super(JptUiMessages.JpaDetailsView_viewNotAvailable);
}
private JpaDetailsPage<? extends JpaStructureNode> buildDetailsPage(JpaStructureNode structureNode) {
JpaDetailsProvider detailsProvider = getDetailsProvider(structureNode);
if (detailsProvider == null) {
return null;
}
String id = structureNode.getId();
Composite container = getWidgetFactory().createComposite(getPageBook());
container.setLayout(new FillLayout(SWT.HORIZONTAL));
JpaDetailsPage<? extends JpaStructureNode> page = detailsProvider.buildDetailsPage(
container,
id,
getWidgetFactory()
);
if (page != null) {
this.detailsPages.put(id, page);
}
return page;
}
/*
* (non-Javadoc)
*/
@Override
public void dispose() {
detailsPages.clear();
currentSelection = JpaSelection.NULL_SELECTION;
currentPage = null;
super.dispose();
}
private JpaDetailsPage<? extends JpaStructureNode> getDetailsPage(JpaStructureNode structureNode) {
if (detailsPages.containsKey(structureNode.getId())) {
JpaDetailsPage<? extends JpaStructureNode> page = detailsPages.get(structureNode.getId());
if ((page != null) &&
(page.getControl().isDisposed())) {
detailsPages.remove(structureNode.getId());
}
else {
return page;
}
}
return buildDetailsPage(structureNode);
}
private JpaDetailsProvider getDetailsProvider(JpaStructureNode structureNode) {
String platformId = structureNode.getJpaProject().getJpaPlatform().getId();
JpaPlatformUi jpaPlatformUI = JpaPlatformUiRegistry.instance().jpaPlatform(platformId);
return jpaPlatformUI.detailsProvider(structureNode);
//TODO this view and the detailsProviders Map is not created on a per project basis.
//the detailsProviders and their fileContentTypes could overlap across project, this would cause problems with storing this map.
}
public JpaSelection getSelection() {
return currentSelection;
}
/*
* (non-Javadoc)
*/
@Override
protected void initialize() {
super.initialize();
this.currentSelection = JpaSelection.NULL_SELECTION;
this.detailsPages = new HashMap<Object, JpaDetailsPage<? extends JpaStructureNode>>();
}
private void log(String message) {
if (Tracing.booleanDebugOption(Tracing.UI_DETAILS_VIEW)) {
Tracing.log(message);
}
}
/*
* (non-Javadoc)
*/
@Override
public void select(JpaSelection jpaSelection) {
if (jpaSelection.equals(currentSelection)) {
return;
}
currentSelection = jpaSelection;
if (jpaSelection != JpaSelection.NULL_SELECTION) {
JpaStructureNode newNode = jpaSelection.getSelectedNode();
JpaDetailsPage<? extends JpaStructureNode> newPage = getDetailsPage(newNode);
setCurrentPage(newPage);
}
else {
setCurrentPage(null);
}
}
/**
* Changes the current page and shows the given page.
*
* @param newPage The new page to display
*/
@SuppressWarnings("unchecked")
private void setCurrentPage(JpaDetailsPage<? extends JpaStructureNode> page) {
// Unpopulate old page
if (currentPage != null) {
try {
log("JpaDetailsView.setCurrentPage() : disposing of current page");
currentPage.setSubject(null);
}
catch (Exception e) {
JptUiPlugin.log(e);
}
}
JpaDetailsPage<JpaStructureNode> newPage = (JpaDetailsPage<JpaStructureNode>) page;
// Populate new page
if (page != null) {
try {
log("JpaDetailsView.setCurrentPage() : populating new page");
newPage.setSubject(currentSelection.getSelectedNode());
}
catch (Exception e) {
// Show error page
page = null;
JptUiPlugin.log(e);
}
}
else {
log("JpaDetailsView.setCurrentPage() : No page to populate");
}
//no need to show the page again if it is still the same
if (newPage != null && currentPage == newPage) {
return;
}
currentPage = newPage;
// Show new page
if (page == null) {
showDefaultPage();
}
else {
showPage(page.getControl());
}
}
}