blob: 9f945bee3ca1ddde4472ca79678dda406bfb9bbf [file] [log] [blame]
/*
* Copyright 2004-2005 Alexey Efimov
*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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 org.intellij.images.options.impl;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.NullableComputable;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.ColorPanel;
import com.intellij.ui.DocumentAdapter;
import com.intellij.util.Consumer;
import org.intellij.images.ImagesBundle;
import org.intellij.images.options.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.Position;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.List;
/**
* Options UI form bean.
*
* @author <a href="mailto:aefimov.box@gmail.com">Alexey Efimov</a>
*/
final class OptionsUIForm {
private JPanel contentPane;
private JCheckBox showGrid;
private JLabel gridLineZoomFactorlLabel;
private JSpinner gridLineZoomFactor;
private JLabel gridLineSpanLabel;
private JSpinner gridLineSpan;
private JCheckBox showChessboard;
private JSpinner chessboardSize;
private JLabel chessboardSizeLabel;
private JCheckBox wheelZooming;
private JCheckBox smartZooming;
private JSpinner smartZoomingWidth;
private JLabel smartZoomingWidthLabel;
private JSpinner smartZoomingHeight;
private JLabel smartZoomingHeightLabel;
private JLabel gridLineColorLabel;
private ColorPanel gridLineColor;
private JLabel chessboardWhiteColorLabel;
private JLabel chessboardBlackColorLabel;
private ColorPanel chessboardBlackColor;
private ColorPanel chessboardWhiteColor;
private JLabel externalEditorLabel;
private TextFieldWithBrowseButton externalEditorPath;
// Options
private final Options options = new OptionsImpl();
OptionsUIForm() {
wheelZooming.setText(ImagesBundle.message("enable.mousewheel.zooming", SystemInfo.isMac ? "Cmd" : "Ctrl"));
// Setup labels
gridLineZoomFactorlLabel.setLabelFor(gridLineZoomFactor);
gridLineSpanLabel.setLabelFor(gridLineSpan);
chessboardSizeLabel.setLabelFor(chessboardSize);
smartZoomingWidthLabel.setLabelFor(smartZoomingWidth);
smartZoomingHeightLabel.setLabelFor(smartZoomingHeight);
gridLineColorLabel.setLabelFor(gridLineColor);
chessboardWhiteColorLabel.setLabelFor(chessboardWhiteColor);
chessboardBlackColorLabel.setLabelFor(chessboardBlackColor);
externalEditorLabel.setLabelFor(externalEditorPath);
// Setup listeners for enabling and disabling linked checkbox groups
smartZooming.addItemListener(new LinkEnabledListener(new JComponent[]{
smartZoomingHeightLabel,
smartZoomingHeight,
smartZoomingWidthLabel,
smartZoomingWidth,
}));
// Setup spinners models
gridLineZoomFactor.setModel(new SpinnerNumberModel(GridOptions.DEFAULT_LINE_ZOOM_FACTOR, 2, 8, 1));
gridLineSpan.setModel(new SpinnerNumberModel(GridOptions.DEFAULT_LINE_SPAN, 1, 100, 1));
chessboardSize.setModel(new SpinnerNumberModel(TransparencyChessboardOptions.DEFAULT_CELL_SIZE, 1, 100, 1));
smartZoomingWidth.setModel(new SpinnerNumberModel(ZoomOptions.DEFAULT_PREFFERED_SIZE.width, 1, 9999, 1));
smartZoomingHeight.setModel(new SpinnerNumberModel(ZoomOptions.DEFAULT_PREFFERED_SIZE.height, 1, 9999, 1));
// Setup listeners for chnages
showGrid.addItemListener(new CheckboxOptionsListener(GridOptions.ATTR_SHOW_DEFAULT));
gridLineZoomFactor.addChangeListener(new SpinnerOptionsListener(GridOptions.ATTR_LINE_ZOOM_FACTOR));
gridLineSpan.addChangeListener(new SpinnerOptionsListener(GridOptions.ATTR_LINE_SPAN));
showChessboard.addItemListener(new CheckboxOptionsListener(TransparencyChessboardOptions.ATTR_SHOW_DEFAULT));
chessboardSize.addChangeListener(new SpinnerOptionsListener(TransparencyChessboardOptions.ATTR_CELL_SIZE));
wheelZooming.addItemListener(new CheckboxOptionsListener(ZoomOptions.ATTR_WHEEL_ZOOMING));
smartZooming.addItemListener(new CheckboxOptionsListener(ZoomOptions.ATTR_SMART_ZOOMING));
smartZoomingWidth.addChangeListener(new SpinnerOptionsListener(ZoomOptions.ATTR_PREFFERED_WIDTH));
smartZoomingHeight.addChangeListener(new SpinnerOptionsListener(ZoomOptions.ATTR_PREFFERED_HEIGHT));
gridLineColor.addActionListener(new ColorOptionsListener(GridOptions.ATTR_LINE_COLOR));
chessboardWhiteColor.addActionListener(new ColorOptionsListener(TransparencyChessboardOptions.ATTR_WHITE_COLOR));
chessboardBlackColor.addActionListener(new ColorOptionsListener(TransparencyChessboardOptions.ATTR_BLACK_COLOR));
externalEditorPath.getTextField().getDocument()
.addDocumentListener(new TextDocumentOptionsListener(ExternalEditorOptions.ATTR_EXECUTABLE_PATH));
externalEditorPath.addActionListener(new ExternalEditorPathActionListener());
updateUI();
}
public JPanel getContentPane() {
return contentPane;
}
private static class LinkEnabledListener implements ItemListener {
private final JComponent[] children;
LinkEnabledListener(JComponent[] children) {
this.children = children.clone();
}
public void itemStateChanged(ItemEvent e) {
setSelected(e.getStateChange() == ItemEvent.SELECTED);
}
private void setSelected(boolean selected) {
for (JComponent component : children) {
component.setEnabled(selected);
}
}
}
public Options getOptions() {
return options;
}
public void updateUI() {
// Grid options
EditorOptions editorOptions = options.getEditorOptions();
ExternalEditorOptions externalEditorOptions = options.getExternalEditorOptions();
GridOptions gridOptions = editorOptions.getGridOptions();
showGrid.setSelected(gridOptions.isShowDefault());
gridLineZoomFactor.setValue(gridOptions.getLineZoomFactor());
gridLineSpan.setValue(gridOptions.getLineSpan());
gridLineColor.setSelectedColor(gridOptions.getLineColor());
TransparencyChessboardOptions transparencyChessboardOptions = editorOptions.getTransparencyChessboardOptions();
showChessboard.setSelected(transparencyChessboardOptions.isShowDefault());
chessboardSize.setValue(transparencyChessboardOptions.getCellSize());
chessboardWhiteColor.setSelectedColor(transparencyChessboardOptions.getWhiteColor());
chessboardBlackColor.setSelectedColor(transparencyChessboardOptions.getBlackColor());
ZoomOptions zoomOptions = editorOptions.getZoomOptions();
wheelZooming.setSelected(zoomOptions.isWheelZooming());
smartZooming.setSelected(zoomOptions.isSmartZooming());
Dimension prefferedSize = zoomOptions.getPrefferedSize();
smartZoomingWidth.setValue(prefferedSize.width);
smartZoomingHeight.setValue(prefferedSize.height);
externalEditorPath.setText(externalEditorOptions.getExecutablePath());
}
private final class CheckboxOptionsListener implements ItemListener {
private final String name;
private CheckboxOptionsListener(String name) {
this.name = name;
}
@SuppressWarnings({"UnnecessaryBoxing"})
public void itemStateChanged(ItemEvent e) {
options.setOption(name, Boolean.valueOf(ItemEvent.SELECTED == e.getStateChange()));
}
}
private final class SpinnerOptionsListener implements ChangeListener {
private final String name;
private SpinnerOptionsListener(String name) {
this.name = name;
}
public void stateChanged(ChangeEvent e) {
JSpinner source = (JSpinner)e.getSource();
options.setOption(name, source.getValue());
}
}
private final class ColorOptionsListener implements ActionListener {
private final String name;
private ColorOptionsListener(String name) {
this.name = name;
}
public void actionPerformed(ActionEvent e) {
ColorPanel source = (ColorPanel)e.getSource();
options.setOption(name, source.getSelectedColor());
}
}
private final class TextDocumentOptionsListener extends DocumentAdapter {
private final String name;
public TextDocumentOptionsListener(String name) {
this.name = name;
}
protected void textChanged(DocumentEvent documentEvent) {
Document document = documentEvent.getDocument();
Position startPosition = document.getStartPosition();
try {
options.setOption(name, document.getText(startPosition.getOffset(), document.getLength()));
}
catch (BadLocationException e) {
// Ignore
}
}
}
private final class ExternalEditorPathActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
Application application = ApplicationManager.getApplication();
VirtualFile previous = application.runWriteAction(new NullableComputable<VirtualFile>() {
public VirtualFile compute() {
final String path = FileUtil.toSystemIndependentName(externalEditorPath.getText());
return LocalFileSystem.getInstance().refreshAndFindFileByPath(path);
}
});
FileChooserDescriptor fileDescriptor = new FileChooserDescriptor(true, SystemInfo.isMac, false, false, false, false);
fileDescriptor.setShowFileSystemRoots(true);
fileDescriptor.setTitle(ImagesBundle.message("select.external.executable.title"));
fileDescriptor.setDescription(ImagesBundle.message("select.external.executable.message"));
FileChooser.chooseFiles(fileDescriptor, null, previous, new Consumer<List<VirtualFile>>() {
@Override
public void consume(final List<VirtualFile> files) {
String path = files.get(0).getPath();
externalEditorPath.setText(path);
}
});
}
}
}