/******************************************************************************* * Copyright (c) 2004, 2016 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.help.ui.internal.views; import java.util.ArrayList; import org.eclipse.help.ui.internal.Messages; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.preference.IPreferenceNode; import org.eclipse.jface.preference.PreferenceDialog; import org.eclipse.jface.preference.PreferenceManager; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; 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.Shell; public class ScopePreferenceDialog extends PreferenceDialog { private EngineDescriptorManager descManager; private ArrayList<PendingOperation> pendingOperations; class PendingOperation { int action; EngineDescriptor desc; public PendingOperation(int action, EngineDescriptor desc) { this.action = action; this.desc = desc; } } /** * The Add button id. */ private final static int NEW_ID = IDialogConstants.CLIENT_ID + 1; /** * The Remove button id. */ private final static int DELETE_ID = IDialogConstants.CLIENT_ID + 2; public ScopePreferenceDialog(Shell parentShell, PreferenceManager manager, EngineDescriptorManager descManager, boolean editable) { super(parentShell, manager); this.descManager = descManager; } @Override protected Control createTreeAreaContents(Composite parent) { GridLayout layout = new GridLayout(); layout.marginWidth = layout.marginHeight = 0; Composite container = new Composite(parent, SWT.NULL); container.setLayout(layout); Control treeControl = super.createTreeAreaContents(container); GridData treeGd = (GridData)treeControl.getLayoutData(); GridData gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan = 2; treeControl.setLayoutData(gd); Button lbutton = createButton(container, NEW_ID, Messages.ScopePreferenceDialog_new, false); gd = (GridData)lbutton.getLayoutData(); gd.horizontalAlignment = GridData.HORIZONTAL_ALIGN_BEGINNING; Button rbutton = createButton(container, DELETE_ID, Messages.ScopePreferenceDialog_delete, false); rbutton.setEnabled(false); gd = (GridData)rbutton.getLayoutData(); gd.horizontalAlignment = GridData.HORIZONTAL_ALIGN_BEGINNING; layout.numColumns = 2; container.setLayoutData(treeGd); Point size = container.computeSize(SWT.DEFAULT, SWT.DEFAULT, true); treeGd.widthHint = Math.max(treeGd.widthHint, size.x); return container; } @Override protected TreeViewer createTreeViewer(Composite parent) { TreeViewer viewer = super.createTreeViewer(parent); viewer.addSelectionChangedListener(event -> { IStructuredSelection ssel = (IStructuredSelection) event.getSelection(); Object obj = ssel.getFirstElement(); treeSelectionChanged(obj); }); return viewer; } @Override protected void buttonPressed(int buttonId) { switch (buttonId) { case NEW_ID: doNew(); break; case DELETE_ID: doDelete(); break; default: super.buttonPressed(buttonId); } } private void treeSelectionChanged(Object obj) { boolean removable = false; if (obj instanceof ScopePreferenceManager.EnginePreferenceNode) { ScopePreferenceManager.EnginePreferenceNode node = (ScopePreferenceManager.EnginePreferenceNode)obj; EngineDescriptor desc = node.getDescriptor(); removable = desc.isUserDefined(); } getButton(DELETE_ID).setEnabled(removable); } private void doNew() { NewEngineWizard wizard = new NewEngineWizard(descManager.getEngineTypes()); WizardDialog dialog = new WizardDialog(getShell(), wizard); dialog.create(); dialog.getShell().setSize(400, 500); if (dialog.open()==WizardDialog.OK) { EngineTypeDescriptor etdesc = wizard.getSelectedEngineType(); EngineDescriptor desc = new EngineDescriptor(descManager); desc.setEngineType(etdesc); desc.setUserDefined(true); desc.setId(descManager.computeNewId(etdesc.getId())); ScopePreferenceManager mng = (ScopePreferenceManager)getPreferenceManager(); IPreferenceNode node = mng.addNode(desc); getTreeViewer().refresh(); getTreeViewer().setSelection(new StructuredSelection(node)); scheduleOperation(NEW_ID, desc); } } private void doDelete() { Object obj = ((IStructuredSelection)getTreeViewer().getSelection()).getFirstElement(); if (obj instanceof ScopePreferenceManager.EnginePreferenceNode) { ScopePreferenceManager.EnginePreferenceNode node = (ScopePreferenceManager.EnginePreferenceNode)obj; EngineDescriptor desc = node.getDescriptor(); //ScopePreferenceManager mng = (ScopePreferenceManager)getPreferenceManager(); getTreeViewer().remove(node); scheduleOperation(DELETE_ID, desc); } } private void scheduleOperation(int action, EngineDescriptor desc) { if (pendingOperations==null) pendingOperations = new ArrayList<>(); pendingOperations.add(new PendingOperation(action, desc)); } @Override protected void okPressed() { super.okPressed(); if (pendingOperations!=null) { // process pending operations for (int i=0; i<pendingOperations.size(); i++) { PendingOperation op = pendingOperations.get(i); if (op.action==NEW_ID) descManager.add(op.desc); else descManager.remove(op.desc); } pendingOperations = null; } descManager.save(); } }