com.intellij.uiDesigner.propertyInspector.editors.string.StringEditor.java Source code

Java tutorial

Introduction

Here is the source code for com.intellij.uiDesigner.propertyInspector.editors.string.StringEditor.java

Source

/*
 * Copyright 2000-2009 JetBrains s.r.o.
 *
 * 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 com.intellij.uiDesigner.propertyInspector.editors.string;

import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonShortcuts;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.ui.DocumentAdapter;
import com.intellij.uiDesigner.UIDesignerBundle;
import com.intellij.uiDesigner.designSurface.GuiEditor;
import com.intellij.uiDesigner.lw.StringDescriptor;
import com.intellij.uiDesigner.propertyInspector.DesignerToolWindowManager;
import com.intellij.uiDesigner.propertyInspector.PropertyEditor;
import com.intellij.uiDesigner.propertyInspector.InplaceContext;
import com.intellij.uiDesigner.propertyInspector.properties.IntroStringProperty;
import com.intellij.uiDesigner.radComponents.RadComponent;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * @author Anton Katilin
 * @author Vladimir Kondratyev
 */
public final class StringEditor extends PropertyEditor<StringDescriptor> {
    private static final Logger LOG = Logger
            .getInstance("#com.intellij.uiDesigner.propertyInspector.editors.string.StringEditor");

    @Nullable
    private IntroStringProperty myProperty;
    private final TextFieldWithBrowseButton myTfWithButton;
    /* Initial value of string property that was passed into getComponent() method */
    private StringDescriptor myValue;
    private Project myProject;
    private RadComponent myComponent;
    private boolean myTextFieldModified = false;

    public StringEditor(Project project) {
        this(project, null);
    }

    public StringEditor(Project project, final IntroStringProperty property) {
        myProject = project;
        myProperty = property;
        myTfWithButton = new TextFieldWithBrowseButton(new MyActionListener());
        myTfWithButton.getTextField().setBorder(null);

        final JTextField textField = myTfWithButton.getTextField();
        textField.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                fireValueCommitted(false, false);
            }
        });
        textField.getDocument().addDocumentListener(new DocumentAdapter() {
            protected void textChanged(final DocumentEvent e) {
                preferredSizeChanged();
                myTextFieldModified = true;
            }
        });

        final MyCancelEditingAction cancelEditingAction = new MyCancelEditingAction();
        cancelEditingAction.registerCustomShortcutSet(CommonShortcuts.ESCAPE, myTfWithButton);
    }

    /**
     * @return current preferred size of the editor component
     */
    public Dimension getPreferredSize() {
        return myTfWithButton.getPreferredSize();
    }

    public void updateUI() {
        SwingUtilities.updateComponentTreeUI(myTfWithButton);
    }

    /**
     * Applies specified bundle to the myTfWithBrowseButton
     */
    private void setValue(final StringDescriptor descriptor) {
        myValue = descriptor;
        final JTextField textField = myTfWithButton.getTextField();
        if (descriptor != null) {
            final String value = descriptor.getValue();
            if (value != null) { // plain value
                textField.setEditable(true);
                textField.setText(value);
                textField.selectAll();
                myTextFieldModified = false;
            } else { // bundled value
                textField.setEditable(false);
                textField.setBackground(UIUtil.getTextFieldBackground());
                textField.setText("[" + descriptor.getKey() + " / " + descriptor.getDottedBundleName() + "]");
            }
        } else {
            textField.setEditable(true);
            textField.setText(null);
        }
    }

    public JComponent getPreferredFocusedComponent(@NotNull final JComponent component) {
        return ((TextFieldWithBrowseButton) component).getTextField();
    }

    public JComponent getComponent(final RadComponent component, final StringDescriptor value,
            final InplaceContext inplaceContext) {
        myComponent = component;
        setValue(value);

        myTfWithButton.getTextField().setBorder(null);
        if (inplaceContext != null && inplaceContext.isStartedByTyping()) {
            myTfWithButton.setText(Character.toString(inplaceContext.getStartChar()));
        }

        return myTfWithButton;
    }

    public StringDescriptor getValue() {
        if (myValue == null || (myValue.getValue() != null && myTextFieldModified)) {
            // editor is for "trivial" StringDescriptor
            final String value = myTfWithButton.getText();
            if (myValue == null && value.length() == 0) {
                return null;
            } else {
                final StringDescriptor stringDescriptor = StringDescriptor.create(value);
                if (myValue != null && myValue.isNoI18n()) {
                    stringDescriptor.setNoI18n(true);
                }
                return stringDescriptor;
            }
        } else { // editor is for "bundled" StringDescriptor
            return myValue;
        }
    }

    private final class MyCancelEditingAction extends AnAction {
        public void actionPerformed(final AnActionEvent e) {
            fireEditingCancelled();
        }
    }

    private final class MyActionListener implements ActionListener {
        public void actionPerformed(final ActionEvent e) {
            // 1. Show editor dialog

            final GuiEditor guiEditor = DesignerToolWindowManager.getInstance(myProject).getActiveFormEditor();
            LOG.assertTrue(guiEditor != null);

            final StringEditorDialog dialog = new StringEditorDialog(myTfWithButton.getTextField(), getValue(), // we have pass here "live" (modified) value
                    guiEditor.getStringDescriptorLocale(), guiEditor);

            CommandProcessor.getInstance().executeCommand(myProject, new Runnable() {
                public void run() {
                    if (!guiEditor.ensureEditable()) {
                        return;
                    }
                    dialog.show();
                    if (!dialog.isOK()) {
                        return;
                    }

                    // 2. Apply new value
                    final StringDescriptor descriptor = dialog.getDescriptor();
                    if (descriptor == null) {
                        return;
                    }
                    setValue(descriptor);
                    fireValueCommitted(true, false);
                    if (myProperty != null) {
                        myProperty.refreshValue(myComponent);
                    }
                    guiEditor.refreshAndSave(false);
                }
            }, UIDesignerBundle.message("command.edit.string.property"), null);
        }
    }
}