blob: 9d92199e0a3b134767f551ed64921d041c6d3777 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2008 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.internal.ua.ui.wizards.toc;
import java.util.ArrayList;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.pde.core.IModel;
import org.eclipse.pde.core.plugin.*;
import org.eclipse.pde.internal.core.ibundle.IBundlePluginModelBase;
import org.eclipse.pde.internal.core.util.PDETextHelper;
import org.eclipse.pde.internal.ui.IHelpContextIds;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.ui.PlatformUI;
/**
* RegisterTocWizardPage
*/
public class RegisterTocWizardPage extends WizardPage implements IRegisterTOCData {
public static final int NUM_COLUMNS = 2;
public final static String F_PAGE_NAME = "register-toc"; //$NON-NLS-1$
public final static String F_TOC_ELEMENT_TOC = "toc"; //$NON-NLS-1$
private Button fPrimaryChkBox;
protected IModel fTocModel;
private ISharedExtensionsModel fExtensionsModel;
private IProject fPluginProject;
private boolean fDataIsPrimary;
public RegisterTocWizardPage(IModel model) {
super(F_PAGE_NAME);
fTocModel = model;
initialize();
}
private void initialize() {
setTitle(TocWizardMessages.RegisterTocWizardPage_title);
setDescription(TocWizardMessages.RegisterTocWizardPage_description);
fPrimaryChkBox = null;
fDataIsPrimary = true;
// Get the project the TOC is stored in
fPluginProject = fTocModel.getUnderlyingResource().getProject();
initializePluginModel();
}
private void initializePluginModel() {
IPluginModelBase base = PluginRegistry.findModel(getPluginProject());
if (base == null)
return;
if (base instanceof IBundlePluginModelBase)
fExtensionsModel = ((IBundlePluginModelBase) base).getExtensionsModel();
else
fExtensionsModel = base;
}
private void updateUI() {
if (fExtensionsModel != null) {
// Find all TOC extensions within the host plug-in
IPluginExtension[] extensions = RegisterTocOperation.findTOCExtensions(fExtensionsModel);
// Process all TOC elements
processTocElements(extensions);
}
}
private void processTocElements(IPluginExtension[] extensions) {
// Query cheat sheet extensions for information required to update
// the description text and category combo widgets
// Linear search: Process all cheat sheet extensions found
for (int i = 0; i < extensions.length; i++) {
if (extensions[i].getChildCount() == 0) {
// Extension has no children, skip to the next extension
continue;
}
IPluginExtension extension = extensions[i];
IPluginObject[] pluginObjects = extension.getChildren();
// Process all children
for (int j = 0; j < pluginObjects.length; j++) {
if (pluginObjects[j] instanceof IPluginElement) {
IPluginElement element = (IPluginElement) pluginObjects[j];
if (element.getName().equals(F_TOC_ELEMENT_TOC)) {
// TOC element
processTocElement(element, getDataTocFile());
}
}
}
}
}
private void processTocElement(IPluginElement parentElement, String generatedID) {
// Get the id attribute
IPluginAttribute fileAttribute = parentElement.getAttribute(RegisterTocOperation.F_TOC_ATTRIBUTE_FILE);
// Check for the generated ID for this TOC
// If a TOC exists with the generated ID already, read its
// description and populate the description text accordingly
if ((fileAttribute != null) && PDETextHelper.isDefined(fileAttribute.getValue()) && generatedID.equals(fileAttribute.getValue())) {
// Matching TOC extension found
// Process children if any
if (parentElement.getChildCount() > 0) {
// Update the description text widget
updateUIPrimary(parentElement);
}
}
}
private void updateUIPrimary(IPluginElement parentElement) {
IPluginObject pluginObject = parentElement.getChildren()[0];
if (pluginObject instanceof IPluginElement) {
IPluginElement element = (IPluginElement) pluginObject;
if (element.getName().equals(RegisterTocOperation.F_TOC_ATTRIBUTE_PRIMARY) && PDETextHelper.isDefinedAfterTrim(element.getText())) {
// Triggers listener to update data description on load
fPrimaryChkBox.setSelection(Boolean.getBoolean(element.getText().trim()));
}
}
}
@Override
public boolean getDataPrimary() {
return fDataIsPrimary;
}
@Override
public String getDataTocFile() {
return fTocModel.getUnderlyingResource().getProjectRelativePath().toPortableString();
}
@Override
public IProject getPluginProject() {
return fPluginProject;
}
@Override
public void createControl(Composite parent) {
createUI(parent);
createUIListeners();
updateUI();
validateUI();
}
private void createUI(Composite parent) {
// Create the container
Composite container = createUIContainer(parent);
// Create the primary checkbox
createUIPrimaryChkBox(container);
// Set the control for the reciever
// Must be done otherwise a null assertion error is generated
setControl(container);
// Apply the dialog font to all controls using the default font
Dialog.applyDialogFont(container);
// Provide functionality for the help button
PlatformUI.getWorkbench().getHelpSystem().setHelp(container, IHelpContextIds.REGISTER_TOC);
}
private Composite createUIContainer(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = NUM_COLUMNS;
container.setLayout(layout);
return container;
}
private void createUIPrimaryChkBox(Composite parent) {
fPrimaryChkBox = new Button(parent, SWT.CHECK);
fPrimaryChkBox.setText(TocWizardMessages.RegisterTocWizardPage_makePrimary);
GridData data = new GridData();
data.horizontalSpan = NUM_COLUMNS;
fPrimaryChkBox.setLayoutData(data);
fPrimaryChkBox.setSelection(true);
}
private void createUIListeners() {
// Create listeners for the primary check box
createUIListenersPrimaryChkBox();
}
private void createUIListenersPrimaryChkBox() {
fPrimaryChkBox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fDataIsPrimary = fPrimaryChkBox.getSelection();
}
});
}
private void validateUI() {
setPageComplete(true);
}
public IPluginExtension[] findExtensions(IPluginModelBase model, String extensionPointID) {
IPluginExtension[] extensions = model.getPluginBase().getExtensions();
ArrayList tocExtensions = new ArrayList();
for (int i = 0; i < extensions.length; i++) {
String point = extensions[i].getPoint();
if (extensionPointID.equals(point)) {
tocExtensions.add(extensions[i]);
}
}
return (IPluginExtension[]) tocExtensions.toArray(new IPluginExtension[tocExtensions.size()]);
}
}