/******************************************************************************* * Copyright (c) 2015 QNX Software Systems 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: * QNX Software Systems - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.internal.qt.ui.preferences; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.cdt.internal.qt.ui.Activator; import org.eclipse.cdt.internal.qt.ui.Messages; import org.eclipse.cdt.qt.core.IQtInstall; import org.eclipse.cdt.qt.core.IQtInstallManager; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; 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.swt.widgets.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; public class QtPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { private IQtInstallManager manager; private Table installTable; private Button removeButton; private Map<Path, IQtInstall> installsToAdd = new HashMap<>(); private Map<Path, IQtInstall> installsToRemove = new HashMap<>(); @Override public void init(IWorkbench workbench) { manager = Activator.getService(IQtInstallManager.class); } @Override protected Control createContents(Composite parent) { Composite control = new Composite(parent, SWT.NONE); control.setLayout(new GridLayout()); Group installsGroup = new Group(control, SWT.NONE); installsGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); installsGroup.setText(Messages.QtPreferencePage_0); installsGroup.setLayout(new GridLayout(2, false)); Composite installTableComp = new Composite(installsGroup, SWT.NONE); installTableComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); installTable = new Table(installTableComp, SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.FULL_SELECTION); installTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); installTable.setHeaderVisible(true); installTable.setLinesVisible(true); installTable.addListener(SWT.Selection, e -> { TableItem[] items = installTable.getSelection(); removeButton.setEnabled(items.length > 0); }); TableColumn nameColumn = new TableColumn(installTable, SWT.NONE); nameColumn.setText(Messages.QtPreferencePage_1); TableColumn locationColumn = new TableColumn(installTable, SWT.NONE); locationColumn.setText(Messages.QtPreferencePage_2); TableColumnLayout tableLayout = new TableColumnLayout(); tableLayout.setColumnData(nameColumn, new ColumnWeightData(75, 350, true)); tableLayout.setColumnData(locationColumn, new ColumnWeightData(25, 100, true)); installTableComp.setLayout(tableLayout); Composite buttonsComp = new Composite(installsGroup, SWT.NONE); buttonsComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true)); buttonsComp.setLayout(new GridLayout()); Button addButton = new Button(buttonsComp, SWT.PUSH); addButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); addButton.setText(Messages.QtPreferencePage_3); addButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { NewQtInstallWizard wizard = new NewQtInstallWizard(getInstalls()); WizardDialog dialog = new WizardDialog(getShell(), wizard); if (dialog.open() == Window.OK) { IQtInstall install = wizard.getInstall(); if (installsToRemove.containsKey(install.getQmakePath())) { installsToRemove.remove(install.getQmakePath()); } else { installsToAdd.put(install.getQmakePath(), install); } updateTable(); } } }); removeButton = new Button(buttonsComp, SWT.PUSH); removeButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); removeButton.setText(Messages.QtPreferencePage_4); removeButton.setEnabled(false); removeButton.addListener(SWT.Selection, e -> { if (MessageDialog.openConfirm(getShell(), Messages.QtPreferencePage_5, Messages.QtPreferencePage_6)) { for (TableItem item : installTable.getSelection()) { IQtInstall install = (IQtInstall) item.getData(); if (installsToAdd.containsKey(install.getQmakePath())) { installsToAdd.remove(install.getQmakePath()); } else { installsToRemove.put(install.getQmakePath(), install); } updateTable(); } } }); updateTable(); return control; } private Map<Path, IQtInstall> getInstalls() { Map<Path, IQtInstall> installs = new HashMap<>(); for (IQtInstall install : manager.getInstalls()) { installs.put(install.getQmakePath(), install); } for (IQtInstall install : installsToAdd.values()) { installs.put(install.getQmakePath(), install); } for (IQtInstall install : installsToRemove.values()) { installs.remove(install.getQmakePath()); } return installs; } private void updateTable() { List<IQtInstall> sorted = new ArrayList<>(getInstalls().values()); Collections.sort(sorted, (o1, o2) -> o1.getQmakePath().toString().compareToIgnoreCase(o2.getQmakePath().toString())); installTable.removeAll(); for (IQtInstall install : sorted) { TableItem item = new TableItem(installTable, SWT.NONE); item.setText(0, install.getQmakePath().toString()); String spec = install.getSpec(); if (spec != null) { item.setText(1, install.getSpec()); } item.setData(install); } } @Override public boolean performOk() { for (IQtInstall install : installsToAdd.values()) { manager.addInstall(install); } for (IQtInstall install : installsToRemove.values()) { manager.removeInstall(install); } return true; } }