Java tutorial
/* * 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); } } }