diff options
Diffstat (limited to 'jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/views/JpaDetailsView.java')
-rw-r--r-- | jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/views/JpaDetailsView.java | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/views/JpaDetailsView.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/views/JpaDetailsView.java new file mode 100644 index 0000000000..4fd5ec5c60 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/views/JpaDetailsView.java @@ -0,0 +1,167 @@ +/******************************************************************************* + * Copyright (c) 2006 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.Iterator; +import java.util.Map; +import org.eclipse.jpt.core.internal.IJpaContentNode; +import org.eclipse.jpt.ui.internal.IJpaPlatformUi; +import org.eclipse.jpt.ui.internal.JpaUiMessages; +import org.eclipse.jpt.ui.internal.PlatformRegistry; +import org.eclipse.jpt.ui.internal.details.IJpaDetailsPage; +import org.eclipse.jpt.ui.internal.details.IJpaDetailsProvider; +import org.eclipse.jpt.ui.internal.selection.Selection; +import org.eclipse.jpt.utility.internal.iterators.CloneIterator; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.widgets.Composite; + +public class JpaDetailsView extends AbstractJpaView +{ + private Selection currentSelection; + + private IJpaDetailsPage currentPage; + + /* key: String file content id, value: IJpaDetailsProvider */ + private Map<String, IJpaDetailsProvider> detailsProviders; + + /* key: Object content node id, value: Composite page */ + private Map<Object, IJpaDetailsPage> detailsPages; + + public JpaDetailsView() { + super(JpaUiMessages.JpaDetailsView_viewNotAvailable); + this.currentSelection = Selection.NULL_SELECTION; + this.detailsProviders = new HashMap<String, IJpaDetailsProvider>(); + this.detailsPages = new HashMap<Object, IJpaDetailsPage>(); + } + + + public Selection getSelection() { + return currentSelection; + } + + public void select(Selection newSelection) { + if (newSelection.equals(currentSelection)) { + return; + } + + currentSelection = newSelection; + + if (newSelection != Selection.NULL_SELECTION) { + IJpaContentNode newNode = newSelection.getSelectedNode(); + IJpaDetailsPage newPage = getDetailsPage(newNode); + setCurrentPage(newPage); + } + else if (currentSelection != Selection.NULL_SELECTION) { + setCurrentPage(null); + } + } + + private IJpaDetailsPage getDetailsPage(IJpaContentNode contentNode) { + if (detailsPages.containsKey(contentNode.getId())) { + IJpaDetailsPage page = detailsPages.get(contentNode.getId()); + + if ((page != null) && + (page.getControl().isDisposed())) { + detailsPages.remove(contentNode.getId()); + } + else { + return page; + } + } + + return buildDetailsPage(contentNode); + } + + private IJpaDetailsPage buildDetailsPage(IJpaContentNode contentNode) { + IJpaDetailsProvider detailsProvider = + getDetailsProvider(contentNode); + + if (detailsProvider == null) { + return null; + } + Composite parentComposite = getWidgetFactory().createComposite(pageBook, SWT.NONE); + parentComposite.setLayout(new FillLayout(SWT.VERTICAL)); + IJpaDetailsPage page = + detailsProvider.buildDetailsPage(parentComposite, contentNode.getId(), getWidgetFactory()); + + if (page != null) { + detailsPages.put(contentNode.getId(), page); + } + + return page; + } + + private IJpaDetailsProvider getDetailsProvider(IJpaContentNode contentNode) { + String contentId = contentNode.getJpaFile().getContentId(); + IJpaDetailsProvider provider = detailsProviders.get(contentId); + + if (provider == null) { + String platformId = contentNode.getJpaProject().getPlatform().getId(); + IJpaPlatformUi jpaPlatformUI = PlatformRegistry.INSTANCE.getJpaPlatform(platformId); + for (IJpaDetailsProvider p : jpaPlatformUI.detailsProviders()) { + if (p.fileContentType().equals(contentId)) { + provider = p; + break; + } + } + + //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. + + if (provider != null) { + detailsProviders.put(contentId, provider); + } + } + + return provider; + } + + private void setCurrentPage(IJpaDetailsPage newPage) { + // depopulate old page + if ((currentPage != null) && (currentPage != newPage)) { + currentPage.populate(null); + } + + // populate new page + if (newPage != null) { + newPage.populate(currentSelection.getSelectedNode()); + } + + currentPage = newPage; + + // show new page + if (newPage == null) { + showDefaultPage(); + } + else { + pageBook.showPage(newPage.getControl().getParent()); + } + } + + public void dispose() { + for (Iterator<String> stream = new CloneIterator<String>(detailsProviders.keySet()); stream.hasNext(); ) { + String key = stream.next(); + IJpaDetailsProvider provider = detailsProviders.remove(key); + provider.dispose(); + } + + for (Iterator<Object> stream = new CloneIterator<Object>(detailsPages.keySet()); stream.hasNext(); ) { + Object key = stream.next(); + IJpaDetailsPage detailsPage = detailsPages.remove(key); + detailsPage.dispose(); + } + + currentSelection = Selection.NULL_SELECTION; + currentPage = null; + + super.dispose(); + } +}
\ No newline at end of file |