diff options
Diffstat (limited to 'org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/GlobalConfigurationPreferencePage.java')
-rw-r--r-- | org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/GlobalConfigurationPreferencePage.java | 190 |
1 files changed, 158 insertions, 32 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/GlobalConfigurationPreferencePage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/GlobalConfigurationPreferencePage.java index 9336c65cd1..40c22500d9 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/GlobalConfigurationPreferencePage.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/GlobalConfigurationPreferencePage.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010, SAP AG. + * Copyright (c) 2010, 2023 SAP AG and others * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -34,9 +34,12 @@ import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jgit.events.ConfigChangedEvent; import org.eclipse.jgit.events.ConfigChangedListener; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.StoredConfig; import org.eclipse.jgit.storage.file.FileBasedConfig; +import org.eclipse.jgit.storage.file.UserConfigFile; import org.eclipse.jgit.util.FS; import org.eclipse.jgit.util.SystemReader; import org.eclipse.swt.SWT; @@ -65,10 +68,14 @@ public class GlobalConfigurationPreferencePage extends PreferencePage implements private FileBasedConfig userConfig; + private FileBasedConfig xdgConfig; + private FileBasedConfig sysConfig; private StackLayout repoConfigStackLayout; + private StackLayout userConfigStackLayout; + private List<Repository> repositories; private Map<Repository, ConfigurationEditorComponent> repoConfigEditors = new HashMap<>(); @@ -77,14 +84,20 @@ public class GlobalConfigurationPreferencePage extends PreferencePage implements private boolean userIsDirty; + private boolean xdgIsDirty; + private boolean sysIsDirty; private ConfigurationEditorComponent userConfigEditor; + private ConfigurationEditorComponent xdgConfigEditor; + private ConfigurationEditorComponent sysConfigEditor; private Composite repoConfigComposite; + private Composite userConfigComposite; + @Override protected Control createContents(Composite parent) { @@ -92,19 +105,97 @@ public class GlobalConfigurationPreferencePage extends PreferencePage implements SWTUtils.MARGINS_NONE); TabFolder tabFolder = new TabFolder(composite, SWT.NONE); tabFolder.setLayoutData(SWTUtils.createHVFillGridData()); - userConfigEditor = new ConfigurationEditorComponent(tabFolder, - userConfig, true, 5) { - @Override - protected void setErrorMessage(String message) { - GlobalConfigurationPreferencePage.this.setErrorMessage(message); - } + Control userTabControl; + if (xdgConfig != null) { + Composite userTab = new Composite(tabFolder, SWT.NONE); + String variable = SystemReader.getInstance().isWindows() + ? '%' + Constants.XDG_CONFIG_HOME + '%' + : '$' + Constants.XDG_CONFIG_HOME; + String[] items = { "~" + File.separatorChar + ".gitconfig", //$NON-NLS-1$ //$NON-NLS-2$ + variable + File.separatorChar + "git" //$NON-NLS-1$ + + File.separatorChar + Constants.CONFIG }; + Combo userCombo = insertCombo(userTab, + UIText.GlobalConfigurationPreferencePage_userSettingLabel, + items); + userCombo.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + Combo combo = (Combo) e.widget; + switch (combo.getSelectionIndex()) { + case 0: + userConfigStackLayout.topControl = userConfigEditor + .getContents(); + break; + case 1: + userConfigStackLayout.topControl = xdgConfigEditor + .getContents(); + break; + default: + return; + } + userConfigComposite.layout(); + } + }); - @Override - protected void setDirty(boolean dirty) { - userIsDirty = dirty; - updateApplyButton(); - } - }; + userConfigComposite = new Composite(userTab, SWT.NONE); + GridDataFactory.fillDefaults().grab(true, true) + .applyTo(userConfigComposite); + userConfigStackLayout = new StackLayout(); + userConfigComposite.setLayout(userConfigStackLayout); + userConfigEditor = new ConfigurationEditorComponent( + userConfigComposite, userConfig, true, 5) { + @Override + protected void setErrorMessage(String message) { + GlobalConfigurationPreferencePage.this + .setErrorMessage(message); + } + + @Override + protected void setDirty(boolean dirty) { + userIsDirty = dirty; + updateApplyButton(); + } + }; + Control control = userConfigEditor.createContents(); + Dialog.applyDialogFont(control); + userConfigStackLayout.topControl = control; + + xdgConfigEditor = new ConfigurationEditorComponent( + userConfigComposite, + xdgConfig, true, 5) { + @Override + protected void setErrorMessage(String message) { + GlobalConfigurationPreferencePage.this + .setErrorMessage(message); + } + + @Override + protected void setDirty(boolean dirty) { + xdgIsDirty = dirty; + updateApplyButton(); + } + }; + control = xdgConfigEditor.createContents(); + Dialog.applyDialogFont(control); + userTabControl = userTab; + } else { + userConfigEditor = new ConfigurationEditorComponent(tabFolder, + userConfig, true, 5) { + @Override + protected void setErrorMessage(String message) { + GlobalConfigurationPreferencePage.this + .setErrorMessage(message); + } + + @Override + protected void setDirty(boolean dirty) { + userIsDirty = dirty; + updateApplyButton(); + } + }; + userTabControl = userConfigEditor.createContents(); + Dialog.applyDialogFont(userTabControl); + } sysConfigEditor = new ConfigurationEditorComponent(tabFolder, sysConfig, true, 5) { @Override @@ -120,17 +211,9 @@ public class GlobalConfigurationPreferencePage extends PreferencePage implements }; Composite repoTab = new Composite(tabFolder, SWT.NONE); - GridLayoutFactory.swtDefaults().margins(0, 0).applyTo(repoTab); - GridDataFactory.fillDefaults().grab(true, true).applyTo(repoTab); - Composite repositoryComposite = new Composite(repoTab, SWT.NONE); - repositoryComposite.setLayout(new GridLayout(2, false)); - GridDataFactory.fillDefaults().grab(true, false).applyTo( - repositoryComposite); - Label repoLabel = new Label(repositoryComposite, SWT.NONE); - repoLabel - .setText(UIText.GlobalConfigurationPreferencePage_repositorySettingRepositoryLabel); - - Combo repoCombo = new Combo(repositoryComposite, SWT.READ_ONLY); + Combo repoCombo = insertCombo(repoTab, + UIText.GlobalConfigurationPreferencePage_repositorySettingRepositoryLabel, + getRepositoryComboItems()); repoCombo.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { @@ -138,7 +221,6 @@ public class GlobalConfigurationPreferencePage extends PreferencePage implements showRepositoryConfiguration(combo.getSelectionIndex()); } }); - repoCombo.setItems(getRepositoryComboItems()); repoConfigComposite = new Composite(repoTab, SWT.NONE); GridDataFactory.fillDefaults().grab(true, true).applyTo(repoConfigComposite); @@ -158,14 +240,12 @@ public class GlobalConfigurationPreferencePage extends PreferencePage implements repoCombo.setEnabled(false); } - Control result = userConfigEditor.createContents(); - Dialog.applyDialogFont(result); TabItem userTabItem = new TabItem(tabFolder, SWT.FILL); - userTabItem.setControl(result); + userTabItem.setControl(userTabControl); userTabItem.setText( UIText.GlobalConfigurationPreferencePage_userSettingTabTitle); - result = sysConfigEditor.createContents(); + Control result = sysConfigEditor.createContents(); Dialog.applyDialogFont(result); TabItem sysTabItem = new TabItem(tabFolder, SWT.FILL); sysTabItem.setControl(result); @@ -187,7 +267,8 @@ public class GlobalConfigurationPreferencePage extends PreferencePage implements @Override protected void updateApplyButton() { if (getApplyButton() != null) - getApplyButton().setEnabled(userIsDirty || sysIsDirty || !dirtyRepositories.isEmpty()); + getApplyButton().setEnabled(userIsDirty || xdgIsDirty || sysIsDirty + || !dirtyRepositories.isEmpty()); } @Override @@ -201,6 +282,14 @@ public class GlobalConfigurationPreferencePage extends PreferencePage implements ok = false; } } + if (xdgIsDirty) { + try { + xdgConfigEditor.save(); + } catch (IOException e) { + Activator.handleError(e.getMessage(), e, true); + ok = false; + } + } if (sysIsDirty) { try { sysConfigEditor.save(); @@ -229,6 +318,9 @@ public class GlobalConfigurationPreferencePage extends PreferencePage implements protected void performDefaults() { try { userConfigEditor.restore(); + if (xdgConfigEditor != null) { + xdgConfigEditor.restore(); + } sysConfigEditor.restore(); for (ConfigurationEditorComponent editor : repoConfigEditors.values()) { editor.restore(); @@ -244,8 +336,26 @@ public class GlobalConfigurationPreferencePage extends PreferencePage implements public void init(IWorkbench workbench) { if (sysConfig == null) sysConfig = SystemReader.getInstance().openSystemConfig(null, FS.DETECTED); - if (userConfig == null) - userConfig = SystemReader.getInstance().openUserConfig(null, FS.DETECTED); // no inherit here! + if (userConfig == null) { + FileBasedConfig userCfg = SystemReader.getInstance() + .openUserConfig(null, FS.DETECTED); + FileBasedConfig xdgCfg = null; + + if (userCfg instanceof UserConfigFile) { + Config base = userCfg.getBaseConfig(); + if (base instanceof FileBasedConfig) { + xdgCfg = (FileBasedConfig) base; + userCfg = new FileBasedConfig(null, userCfg.getFile(), + FS.DETECTED); + if (xdgCfg.getFile() == null + || !xdgCfg.getFile().isFile()) { + xdgCfg = null; + } + } + } + userConfig = userCfg; + xdgConfig = xdgCfg; + } if (repositories == null) { repositories = new ArrayList<>(); List<String> repoPaths = RepositoryUtil.INSTANCE @@ -274,6 +384,22 @@ public class GlobalConfigurationPreferencePage extends PreferencePage implements String.CASE_INSENSITIVE_ORDER)); } + private Combo insertCombo(Composite parent, String label, String[] items) { + GridLayoutFactory.swtDefaults().margins(0, 0).applyTo(parent); + GridDataFactory.fillDefaults().grab(true, true).applyTo(parent); + Composite comboComposite = new Composite(parent, SWT.NONE); + comboComposite.setLayout(new GridLayout(2, false)); + GridDataFactory.fillDefaults().grab(true, false) + .applyTo(comboComposite); + Label l = new Label(comboComposite, SWT.NONE); + l.setText(label); + + Combo combo = new Combo(comboComposite, SWT.READ_ONLY); + combo.setItems(items); + combo.select(0); + return combo; + } + private String[] getRepositoryComboItems() { List<String> items = new ArrayList<>(); for (Repository repository : repositories) { |