/******************************************************************************* * Copyright (c) 2009, 2015 Red Hat Inc. * 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: * Red Hat Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.internal.autotools.ui.properties; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.ListIterator; import java.util.Map; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICResourceDescription; import org.eclipse.cdt.internal.autotools.core.configure.AutotoolsConfigurationManager; import org.eclipse.cdt.internal.autotools.core.configure.IAConfiguration; import org.eclipse.cdt.internal.autotools.core.configure.IConfigureOption; import org.eclipse.cdt.internal.autotools.ui.AbstractAutotoolsCPropertyTab; import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.cdt.managedbuilder.core.IMultiConfiguration; import org.eclipse.cdt.ui.newui.AbstractPage; import org.eclipse.cdt.ui.newui.PageLayout; import org.eclipse.core.resources.IProject; import org.eclipse.jface.preference.IPreferencePageContainer; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.ScrollBar; public class AutotoolsConfigurePropertyTab extends AbstractAutotoolsCPropertyTab implements IPreferencePageContainer { private TreeViewer fTree; private SashForm sashForm; private Composite settingsPageContainer; private AutotoolsConfigurePrefStore settingsStore; private AbstractConfigurePropertyOptionsPage currentSettingsPage; private ScrolledComposite containerSC; private ToolListContentProvider listprovider; private ToolListElement selectedElement; private ICConfigurationDescription icfgd; private Map<String, List<AbstractConfigurePropertyOptionsPage>> configToPageListMap; @Override public boolean canBeVisible() { if (page.isForProject() || page.isForPrefs()) { return true; } return false; } private IAConfiguration getAutotoolsCfg() { AutotoolsConfigurePropertyPage ap = (AutotoolsConfigurePropertyPage)page; // We call getConfigurationData() to get the name because if the configuration has been renamed, // it will cause the option value handler to clone the IAConfiguration return ap.getConfiguration(icfgd); } private void syncClones() { AutotoolsConfigurePropertyPage ap = (AutotoolsConfigurePropertyPage)page; // We call getConfigurationData() to get the name because if the configuration has been renamed, // it will cause the option value handler to clone the IAConfiguration ap.getAllConfigurationData(); } @Override public IPreferenceStore getPreferenceStore() { return settingsStore; } @Override public void createControls(Composite parent) { AutotoolsConfigurationManager.getInstance().clearTmpConfigurations(page.getProject()); syncClones(); super.createControls(parent); Composite composite= usercomp; settingsStore = AutotoolsConfigurePrefStore.getInstance(); configToPageListMap = new HashMap<>(); // assume parent page uses griddata GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_CENTER | GridData.VERTICAL_ALIGN_FILL | GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL); composite.setLayoutData(gd); GridLayout layout= new GridLayout(); composite.setLayout(layout); // Create the sash form sashForm = new SashForm(usercomp, SWT.NONE); sashForm.setOrientation(SWT.HORIZONTAL); sashForm.setLayoutData(new GridData(GridData.FILL_BOTH)); layout = new GridLayout(2, true); layout.marginHeight = 5; sashForm.setLayout(layout); createSelectionArea(sashForm); createEditArea(sashForm); } private void createSelectionArea(Composite parent) { fTree = new TreeViewer(parent, SWT.SINGLE|SWT.H_SCROLL|SWT.V_SCROLL|SWT.BORDER); fTree.addSelectionChangedListener(event -> handleOptionSelection()); fTree.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); // Create a temporary default AutotoolsConfiguration to use for label info IAConfiguration tmp = AutotoolsConfigurationManager.getInstance().createDefaultConfiguration(""); fTree.setLabelProvider(new ToolListLabelProvider(tmp)); } private void createEditArea(Composite parent) { containerSC = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); containerSC.setExpandHorizontal(true); containerSC.setExpandVertical(true); // Add a container for the build settings page settingsPageContainer = new Composite(containerSC, SWT.NONE); settingsPageContainer.setLayout(new PageLayout()); containerSC.setContent(settingsPageContainer); // containerSC.setMinSize(settingsPageContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT)); settingsPageContainer.layout(); } private void setValues() { /* * This method updates the context of the build property pages * - Which configuration/resource configuration is selected * - Which tool/option category is selected * * It is called: * - When a property page becomes visible * - When the user changes the configuration selection * - When the user changes the "exclude" setting for a resource */ IConfiguration icfg = getCfg(icfgd.getConfiguration()); if (icfg instanceof IMultiConfiguration) { fTree.setInput(null); fTree.getControl().setEnabled(false); currentSettingsPage.setVisible(false); return; } IAConfiguration currCfg = getAutotoolsCfg(); // Create the Tree Viewer content provider if first time if (listprovider == null) { listprovider = new ToolListContentProvider(); fTree.setContentProvider(listprovider); } // Update the selected configuration and the Tree Viewer ToolListElement[] newElements; fTree.setInput(currCfg); fTree.getControl().setEnabled(true); newElements = (ToolListElement[])listprovider.getElements(currCfg); fTree.expandAll(); selectedElement = newElements[0]; fTree.setSelection(new StructuredSelection(selectedElement), true); } private void handleOptionSelection() { // Get the selection from the tree list if (fTree == null) return; IStructuredSelection selection = (IStructuredSelection) fTree.getSelection(); ToolListElement element = (ToolListElement)selection.getFirstElement(); if (element != null) { displayPageForElement(element); } ScrollBar sb = containerSC.getHorizontalBar(); if (sb != null && sb.isVisible()) { settingsPageContainer.pack(true); containerSC.setMinSize(settingsPageContainer.getSize()); ((AbstractPage)page).resize(); } } private void displayPageForElement(ToolListElement element) { selectedElement = element; settingsStore.setSelection(getAutotoolsCfg(), selectedElement); AbstractConfigurePropertyOptionsPage oldPage = currentSettingsPage; currentSettingsPage = null; // Create a new settings page if necessary List<AbstractConfigurePropertyOptionsPage> pages = getPagesForConfig(); ListIterator<AbstractConfigurePropertyOptionsPage> iter = pages.listIterator(); while (iter.hasNext()) { AbstractConfigurePropertyOptionsPage page = iter.next(); if (page.getName().equals(element.getName())) { currentSettingsPage = page; break; } } if (currentSettingsPage == null) { if (element.getType() == IConfigureOption.TOOL) { currentSettingsPage = new AutotoolsToolPropertyOptionPage( element, getAutotoolsCfg()); } else { currentSettingsPage = new AutotoolsCategoryPropertyOptionPage( element, getAutotoolsCfg()); } pages.add(currentSettingsPage); currentSettingsPage.setContainer(this); if (currentSettingsPage.getControl() == null) { currentSettingsPage.createControl(settingsPageContainer); } } // Make all the other pages invisible Control[] children = settingsPageContainer.getChildren(); Control currentControl = currentSettingsPage.getControl(); for (int i = 0; i < children.length; i++) { if (children[i] != currentControl) children[i].setVisible(false); } currentSettingsPage.setVisible(true); currentSettingsPage.updateFields(); if (oldPage != null && oldPage != currentSettingsPage) oldPage.setVisible(false); // Set the size of the scrolled area containerSC.setMinSize(currentSettingsPage.computeSize()); settingsPageContainer.layout(); } /** * Answers the list of settings pages for the selected configuration */ private List<AbstractConfigurePropertyOptionsPage> getPagesForConfig() { if (getCfg() == null) return null; List<AbstractConfigurePropertyOptionsPage> pages = configToPageListMap.get(getCfg().getName()); if (pages == null) { pages = new ArrayList<>(); configToPageListMap.put(getCfg().getName(), pages); } return pages; } @Override protected void performOK() { ICConfigurationDescription[] cfgs = page.getCfgsEditable(); AutotoolsConfigurePropertyPage ap = (AutotoolsConfigurePropertyPage)page; Map<String, IAConfiguration> cfgList = new HashMap<>(); for (int i = 0; i < cfgs.length; ++i) { ICConfigurationDescription cd = cfgs[i]; IAConfiguration acfg = ap.getConfiguration(cd); cfgList.put(cd.getId(), acfg); } IProject project = page.getProject(); AutotoolsConfigurationManager.getInstance().replaceProjectConfigurations(project, cfgList, cfgs); AutotoolsConfigurationManager.getInstance().clearTmpConfigurations(project); } @Override protected void performCancel() { AutotoolsConfigurationManager.getInstance().clearTmpConfigurations(page.getProject()); } @Override protected void performApply(ICResourceDescription src, ICResourceDescription dst) { IProject project = page.getProject(); ICConfigurationDescription[] cfgs = page.getCfgsEditable(); // Apply all changes to existing saved configurations and new configurations, but do not perform // deletions. AutotoolsConfigurationManager.getInstance().applyConfigs(project.getName(), cfgs); } @Override protected void performDefaults() { IAConfiguration cfg = getAutotoolsCfg(); cfg.setDefaultOptions(); setValues(); } @Override protected void updateData(ICResourceDescription rd) { if (rd == null) return; icfgd = rd.getConfiguration(); setValues(); } // IPreferencePageContainer methods @Override public void updateButtons() {} @Override public void updateMessage() {} @Override public void updateTitle() {} }