/** * Copyright (c) 2013-2016 Angelo ZERR. * 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: * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation */ package tern.eclipse.ide.internal.ui.preferences; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.IScopeContext; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; 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.ui.IWorkbench; import tern.eclipse.ide.core.IIDETernRepository; import tern.eclipse.ide.core.ITernRepositoryManager; import tern.eclipse.ide.core.TernCorePlugin; import tern.eclipse.ide.core.preferences.TernCorePreferenceConstants; import tern.eclipse.ide.internal.ui.TernUIMessages; import tern.eclipse.ide.ui.ImageResource; import tern.eclipse.ide.ui.controls.TernRepositoryBlock; import tern.eclipse.ide.ui.preferences.PropertyPreferencePage; import tern.repository.ITernRepository; /** * Tern dev preferences page used for global and project preferences. * */ public class TernRepositoryPreferencesPage extends PropertyPreferencePage { public static final String PROPERTY_PAGE_ID = "tern.eclipse.ide.ui.properties.repository"; public static final String PREFERENCE_PAGE_ID = "tern.eclipse.ide.ui.preferences.repository"; private TernRepositoryBlock repositoryBlock; private Button removeButton; private Button editButton; private Button refreshButton; public TernRepositoryPreferencesPage() { setImageDescriptor(ImageResource .getImageDescriptor(ImageResource.IMG_LOGO)); } @Override protected Control createCommonContents(Composite parent) { final Composite page = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.marginHeight = 0; layout.marginWidth = 0; page.setLayout(layout); createRepositoryTable(page); createButtons(page); addListeners(); // load repositories repositoryBlock.loadRepositories(); applyDialogFont(page); return page; } private void createRepositoryTable(Composite parent) { // create UI repository repositoryBlock = new TernRepositoryBlock(getProject()); Control control = repositoryBlock.createControl(parent); GridData data = new GridData(GridData.FILL_BOTH); data.horizontalSpan = 1; control.setLayoutData(data); } private void createButtons(final Composite parent) { Composite buttonComp = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.horizontalSpacing = 0; layout.verticalSpacing = convertVerticalDLUsToPixels(3); layout.marginWidth = 0; layout.marginHeight = 0; layout.numColumns = 1; buttonComp.setLayout(layout); GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL); buttonComp.setLayoutData(data); // Add button Button addButton = createButton(buttonComp, TernUIMessages.Button_add); addButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { repositoryBlock.addRepository(parent.getShell()); } }); // Remove button removeButton = createButton(buttonComp, TernUIMessages.Button_remove); removeButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { repositoryBlock.removeRepository(parent.getShell()); } }); removeButton.setEnabled(false); // Edit button editButton = createButton(buttonComp, TernUIMessages.Button_edit); editButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { repositoryBlock.editRepository(parent.getShell()); } }); editButton.setEnabled(false); // Refresh button refreshButton = createButton(buttonComp, TernUIMessages.Button_refresh); refreshButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { repositoryBlock.refreshRepository(); } }); refreshButton.setEnabled(false); } private static Button createButton(Composite comp, String label) { Button b = new Button(comp, SWT.PUSH); b.setText(label); GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING); b.setLayoutData(data); return b; } private void addListeners() { // Disable/Enable buttons repositoryBlock .addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = (IStructuredSelection) event .getSelection(); if (!selection.isEmpty()) { ITernRepository repository = (ITernRepository) selection .getFirstElement(); removeButton.setEnabled(!repository.isDefault()); editButton.setEnabled(!repository.isDefault()); refreshButton.setEnabled(true); } } }); } @Override protected void performDefaults() { super.performDefaults(); IEclipsePreferences defaultPreferences = createPreferenceScopes()[1] .getNode(getPreferenceNodeQualifier()); String repositoryName = defaultPreferences.get( TernCorePreferenceConstants.USED_REPOSITORY_NAME, ITernRepositoryManager.DEFAULT_REPOSITORY_NAME); IIDETernRepository repository = TernCorePlugin.getTernRepositoryManager() .getRepository(repositoryName); repositoryBlock.setCheckedRepository(repository); repositoryBlock .setCheckedModules(TernCorePreferenceConstants.DEFAULT_TERN_MODULES_VALUE.split(",")); } @Override public boolean performOk() { // save column settings repositoryBlock.saveColumnSettings(); // save tern repositories in the global preferences repositoryBlock.saveRepositories(); boolean ok = super.performOk(); ITernRepository repository = repositoryBlock.getCheckedRepository(); IScopeContext[] contexts = createPreferenceScopes(); // remove project-specific information if it's not enabled IProject project = getProject(); boolean remove = project != null && !isElementSettingsEnabled(); if (remove) { contexts[0].getNode(getPreferenceNodeQualifier()).remove( TernCorePreferenceConstants.USED_REPOSITORY_NAME); } else { contexts[0].getNode(getPreferenceNodeQualifier()).put( TernCorePreferenceConstants.USED_REPOSITORY_NAME, repository.getName()); } flushContexts(contexts); return ok; } @Override protected String getPreferenceNodeQualifier() { return TernCorePlugin.getDefault().getBundle().getSymbolicName(); } @Override protected String getPreferencePageID() { return PREFERENCE_PAGE_ID; } @Override protected String getProjectSettingsKey() { return TernCorePreferenceConstants.REPOSITORY_USE_PROJECT_SETTINGS; } @Override protected String getPropertyPageID() { return PROPERTY_PAGE_ID; } @Override public void init(IWorkbench workbencsh) { } }