/*
* Copyright (c) 2012, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.dart.tools.ui.internal.preferences;
import com.google.dart.tools.core.DartCoreDebug;
import com.google.dart.tools.ui.DartToolsPlugin;
import com.google.dart.tools.ui.Messages;
import com.google.dart.tools.ui.internal.util.ExceptionHandler;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.layout.LayoutConstants;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.util.Geometry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.activities.IActivityManager;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.keys.IBindingService;
import java.io.File;
// TODO verify .savepath
public class DartKeyBindingPreferencePage extends PreferencePage implements
IWorkbenchPreferencePage {
private static final String EXT_XML = ".xml"; //$NON-NLS-1$
private static final String ALL_XML_FILES = "*" + EXT_XML; //$NON-NLS-1$
private static final String ALL_FILES = "*.*"; //$NON-NLS-1$
private static final String ENCODING = "UTF-8"; //$NON-NLS-1$
private static final String LAST_KEY_PATH = "com.google.dart.tools.ui.prefs.key.path"; //$NON-NLS-1$
private static final String SAVE_PATH = ".savepath"; //$NON-NLS-1$ // currently using same previous entry for both import & export
private static final String DESCR_EXPORT = PreferencesMessages.DartKeyBindingPref_Export;
private static final String DESCR_IMPORT = PreferencesMessages.DartKeyBindingPref_Import;
private static final String DESCR_RESET = PreferencesMessages.DartKeyBindingPref_Reset;
private static final String DESCR_EMACS = PreferencesMessages.DartKeyBindingPref_Emacs;
private Button exportButton;
private Button importButton;
private Button resetButton;
private IActivityManager activityManager;
private IBindingService bindingService;
private ICommandService commandService;
private Button emacsButton;
public DartKeyBindingPreferencePage() {
setPreferenceStore(DartToolsPlugin.getDefault().getPreferenceStore());
noDefaultAndApplyButton();
}
@Override
public void init(IWorkbench workbench) {
activityManager = workbench.getActivitySupport().getActivityManager();
bindingService = (IBindingService) workbench.getService(IBindingService.class);
commandService = (ICommandService) workbench.getService(ICommandService.class);
}
@Override
protected Control createContents(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridDataFactory.fillDefaults().grab(true, false).indent(0, 10).align(SWT.FILL, SWT.BEGINNING).applyTo(
composite);
GridLayoutFactory.fillDefaults().spacing(0, 8).margins(0, 10).applyTo(composite);
Group generalGroup = new Group(composite, SWT.NONE);
generalGroup.setText(PreferencesMessages.DartKeyBindingPref_Modify);
GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.BEGINNING).applyTo(
generalGroup);
GridLayoutFactory.fillDefaults().numColumns(1).margins(8, 8).applyTo(generalGroup);
new Label(generalGroup, SWT.NONE).setText(DESCR_EXPORT);
exportButton = new Button(generalGroup, SWT.PUSH | SWT.FLAT | SWT.CENTER);
exportButton.setText(PreferencesMessages.DartKeyBindingPref_ToFile);
exportButton.setLayoutData(new GridData(SWT.CENTER, SWT.END, false, false));
exportButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
exportKeys();
}
});
new Label(generalGroup, SWT.NONE).setText(DESCR_IMPORT);
importButton = new Button(generalGroup, SWT.PUSH | SWT.FLAT | SWT.CENTER);
importButton.setText(PreferencesMessages.DartKeyBindingPref_FromFile);
importButton.setLayoutData(new GridData(SWT.CENTER, SWT.END, false, false));
importButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
importKeys();
}
});
new Label(generalGroup, SWT.NONE).setText(DESCR_RESET);
resetButton = new Button(generalGroup, SWT.PUSH | SWT.FLAT | SWT.CENTER);
resetButton.setText(PreferencesMessages.DartKeyBindingPref_ToDefaults);
resetButton.setLayoutData(new GridData(SWT.CENTER, SWT.END, false, false));
resetButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
resetBindings();
}
});
if (DartCoreDebug.ENABLE_ALT_KEY_BINDINGS) {
new Label(generalGroup, SWT.NONE).setText(DESCR_EMACS);
emacsButton = new Button(generalGroup, SWT.PUSH | SWT.FLAT | SWT.CENTER);
emacsButton.setText(PreferencesMessages.DartKeyBindingPref_ToEmacs);
emacsButton.setLayoutData(new GridData(SWT.CENTER, SWT.END, false, false));
emacsButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
setEmacsBindings();
}
});
}
Point preferredSize = resetButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, false);
Point hint = Geometry.max(LayoutConstants.getMinButtonSize(), preferredSize);
GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER).hint(hint).applyTo(exportButton);
GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER).hint(hint).applyTo(importButton);
GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER).hint(hint).applyTo(resetButton);
if (DartCoreDebug.ENABLE_ALT_KEY_BINDINGS) {
GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER).hint(hint).applyTo(emacsButton);
}
return composite;
}
private void exportKeys() {
String path = requestFilePath(
SWT.SAVE,
PreferencesMessages.DartKeyBindingPref_ChooseExportFile,
SAVE_PATH);
if (path == null) {
return;
}
File file = new File(path);
if (file.exists()
&& !MessageDialog.openQuestion(
getShell(),
PreferencesMessages.DartKeyBindingPref_ExportTitle,
Messages.format(
PreferencesMessages.DartKeyBindingPref_ConfirmReplace,
file.getAbsolutePath()))) {
return;
}
try {
DartKeyBindingPersistence persist;
persist = new DartKeyBindingPersistence(activityManager, bindingService, commandService);
persist.writeFile(file, getEncoding());
} catch (CoreException ex) {
String title = PreferencesMessages.DartKeyBindingPref_ExportTitle;
String message = PreferencesMessages.DartKeyBindingPref_CouldNotExport;
ExceptionHandler.handle(ex, getShell(), title, message);
}
}
private String getEncoding() {
String encoding = ENCODING;
IContentType type = Platform.getContentTypeManager().getContentType(
"com.google.dart.tools.core.runtime.xml"); //$NON-NLS-1$
if (type != null) {
encoding = type.getDefaultCharset();
}
return encoding;
}
private void importKeys() {
String path = requestFilePath(
SWT.OPEN,
PreferencesMessages.DartKeyBindingPref_ChooseImportFile,
SAVE_PATH);
if (path == null) {
return;
}
File file = new File(path);
if (!(file.exists() && file.canRead())) {
MessageDialog.openError(
getShell(),
PreferencesMessages.DartKeyBindingPref_ImportTitle,
Messages.format(
PreferencesMessages.DartKeyBindingPref_FileReadError,
file.getAbsolutePath()));
return;
}
try {
DartKeyBindingPersistence persist;
persist = new DartKeyBindingPersistence(activityManager, bindingService, commandService);
persist.readFile(file, getEncoding());
} catch (Exception ex) {
MessageDialog.openError(
getShell(),
PreferencesMessages.DartKeyBindingPref_ImportTitle,
Messages.format(
PreferencesMessages.DartKeyBindingPref_CouldNotLoad,
new Object[] {
file.getAbsolutePath(),
ex.getMessage() == null ? ex.getClass().getCanonicalName() : ex.getMessage()}));
}
}
private String requestFilePath(int mode, String prompt, String keySuffix) {
FileDialog file = new FileDialog(getShell(), mode);
file.setText(PreferencesMessages.DartKeyBindingPref_ChooseFile);
file.setFilterNames(new String[] {ALL_XML_FILES, ALL_FILES});
file.setFilterExtensions(new String[] {ALL_XML_FILES, ALL_FILES});
String lastPath = DartToolsPlugin.getDefault().getDialogSettings().get(
LAST_KEY_PATH + keySuffix);
if (lastPath != null) {
file.setFilterPath(lastPath);
}
String path = file.open();
if (path != null) {
if (!path.endsWith(EXT_XML)) {
path = path + EXT_XML;
}
DartToolsPlugin.getDefault().getDialogSettings().put(
LAST_KEY_PATH + SAVE_PATH,
file.getFilterPath());
return path;
}
return null;
}
private void resetBindings() {
if (!MessageDialog.openQuestion(
getShell(),
PreferencesMessages.DartKeyBindingPref_ResetBindings,
PreferencesMessages.DartKeyBindingPref_ConfirmReset)) {
return;
}
try {
DartKeyBindingPersistence persist;
persist = new DartKeyBindingPersistence(activityManager, bindingService, commandService);
persist.resetBindings();
} catch (CoreException ex) {
DartToolsPlugin.log(ex);
}
}
private void setEmacsBindings() {
// TODO see DartCoreDebug.ENABLE_ALT_KEY_BINDINGS
MessageDialog.openInformation(getShell(), "Not Implemented", //$NON-NLS-1$
"Emacs bindings are not defined yet."); //$NON-NLS-1$
}
}