diff --git a/CHANGELOG.md b/CHANGELOG.md index 253b97a..6236727 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,9 +3,14 @@ # easy-i18n Changelog ## [Unreleased] +### Added +- Support of path variables for the locales directory configuration @SIMULATAN + +### Changed +- Restructure form actions to improve user experience ## [4.3.1] -### Fixed +### Fixed - Support for all 2022.3 builds (223.*) ## [4.3.0] diff --git a/gradle.properties b/gradle.properties index 88043eb..935dfe8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ pluginGroup = de.marhali.easyi18n pluginName = easy-i18n # SemVer format -> https://semver.org -pluginVersion = 4.3.1 +pluginVersion = 4.4.0 # See https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html # for insight into build numbers and IntelliJ Platform versions. diff --git a/src/main/java/de/marhali/easyi18n/dialog/AddDialog.java b/src/main/java/de/marhali/easyi18n/dialog/AddDialog.java index 84164e9..b561943 100644 --- a/src/main/java/de/marhali/easyi18n/dialog/AddDialog.java +++ b/src/main/java/de/marhali/easyi18n/dialog/AddDialog.java @@ -1,7 +1,6 @@ package de.marhali.easyi18n.dialog; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.DialogBuilder; import com.intellij.openapi.ui.DialogWrapper; import de.marhali.easyi18n.model.action.TranslationCreate; @@ -14,8 +13,6 @@ import de.marhali.easyi18n.settings.ProjectSettingsService; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.swing.*; - /** * Dialog to create a new translation with all associated locale values. * Supports optional prefill technique for translation key or locale value. @@ -35,6 +32,8 @@ public class AddDialog extends TranslationDialog { ? new TranslationValue(ProjectSettingsService.get(project).getState().getPreviewLocale(), prefillLocale) : null) ); + + setTitle(bundle.getString("action.add")); } /** @@ -45,18 +44,6 @@ public class AddDialog extends TranslationDialog { this(project, new KeyPath(), ""); } - - @Override - protected @NotNull DialogBuilder configure(@NotNull JComponent centerPanel) { - DialogBuilder builder = new DialogBuilder(); - builder.setTitle(bundle.getString("action.add")); - builder.removeAllActions(); - builder.addOkAction(); - builder.addCancelAction(); - builder.setCenterPanel(centerPanel); - return builder; - } - @Override protected @Nullable TranslationUpdate handleExit(int exitCode) { if(exitCode == DialogWrapper.OK_EXIT_CODE) { diff --git a/src/main/java/de/marhali/easyi18n/dialog/EditDialog.java b/src/main/java/de/marhali/easyi18n/dialog/EditDialog.java index 6c9662c..aa65349 100644 --- a/src/main/java/de/marhali/easyi18n/dialog/EditDialog.java +++ b/src/main/java/de/marhali/easyi18n/dialog/EditDialog.java @@ -1,7 +1,6 @@ package de.marhali.easyi18n.dialog; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.DialogBuilder; import com.intellij.openapi.ui.DialogWrapper; import de.marhali.easyi18n.dialog.descriptor.DeleteActionDescriptor; @@ -27,18 +26,13 @@ public class EditDialog extends TranslationDialog { */ public EditDialog(@NotNull Project project, @NotNull Translation origin) { super(project, origin); + + setTitle(bundle.getString("action.edit")); } @Override - protected @NotNull DialogBuilder configure(@NotNull JComponent centerPanel) { - DialogBuilder builder = new DialogBuilder(); - builder.setTitle(bundle.getString("action.edit")); - builder.removeAllActions(); - builder.addCancelAction(); - builder.addActionDescriptor(new DeleteActionDescriptor()); - builder.addOkAction(); - builder.setCenterPanel(centerPanel); - return builder; + protected Action @NotNull [] createLeftSideActions() { + return new Action[]{ new DeleteActionDescriptor(this) }; } @Override diff --git a/src/main/java/de/marhali/easyi18n/dialog/TranslationDialog.java b/src/main/java/de/marhali/easyi18n/dialog/TranslationDialog.java index 306e5ba..51307cd 100644 --- a/src/main/java/de/marhali/easyi18n/dialog/TranslationDialog.java +++ b/src/main/java/de/marhali/easyi18n/dialog/TranslationDialog.java @@ -1,7 +1,7 @@ package de.marhali.easyi18n.dialog; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.DialogBuilder; +import com.intellij.openapi.ui.DialogWrapper; import com.intellij.ui.components.JBScrollPane; import com.intellij.ui.components.JBTextField; import com.intellij.util.Consumer; @@ -28,7 +28,7 @@ import java.util.*; * Base for add and edit translation dialogs. * @author marhali */ -abstract class TranslationDialog { +abstract class TranslationDialog extends DialogWrapper { protected static final ResourceBundle bundle = ResourceBundle.getBundle("messages"); @@ -48,6 +48,8 @@ abstract class TranslationDialog { * @param origin Prefill translation */ protected TranslationDialog(@NotNull Project project, @NotNull Translation origin) { + super(project); + this.project = project; this.settings = ProjectSettingsService.get(project).getState(); this.converter = new KeyPathConverter(settings); @@ -75,14 +77,6 @@ abstract class TranslationDialog { callbacks.add(callback); } - /** - * Implementation needs to configure the dialog. E.g. title, actions, ... - * The implementation needs to set the provided centerPanel as the view panel. - * @param centerPanel GUI to set on the dialog builder - * @return configured dialog builder - */ - protected abstract @NotNull DialogBuilder configure(@NotNull JComponent centerPanel); - /** * Implementation needs to handle exit * @param exitCode See {@link com.intellij.openapi.ui.DialogWrapper} for exit codes @@ -95,7 +89,10 @@ abstract class TranslationDialog { * Internally, the {@link #handleExit(int)} method will be called to determine finalization logic. */ public void showAndHandle() { - int exitCode = createDialog().show(); + init(); + show(); + + int exitCode = getExitCode(); TranslationUpdate update = handleExit(exitCode); if(update != null) { @@ -120,7 +117,8 @@ abstract class TranslationDialog { return new Translation(key, value); } - private DialogBuilder createDialog() { + @Override + protected @Nullable JComponent createCenterPanel() { JPanel panel = FormBuilder.createFormBuilder() .addLabeledComponent(bundle.getString("translation.key"), keyField, true) .addComponent(createLocalesPanel(), 12) @@ -128,7 +126,7 @@ abstract class TranslationDialog { panel.setMinimumSize(new Dimension(200, 150)); - return configure(panel); + return panel; } private JComponent createLocalesPanel() { diff --git a/src/main/java/de/marhali/easyi18n/dialog/descriptor/DeleteActionDescriptor.java b/src/main/java/de/marhali/easyi18n/dialog/descriptor/DeleteActionDescriptor.java index 3460601..a7c93b8 100644 --- a/src/main/java/de/marhali/easyi18n/dialog/descriptor/DeleteActionDescriptor.java +++ b/src/main/java/de/marhali/easyi18n/dialog/descriptor/DeleteActionDescriptor.java @@ -1,7 +1,7 @@ package de.marhali.easyi18n.dialog.descriptor; -import com.intellij.openapi.ui.DialogBuilder; import com.intellij.openapi.ui.DialogWrapper; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.event.ActionEvent; @@ -12,26 +12,19 @@ import java.util.ResourceBundle; * Action can be monitored using the exit code for the opened dialog. See EXIT_CODE. * @author marhali */ -public class DeleteActionDescriptor extends AbstractAction implements DialogBuilder.ActionDescriptor { +public class DeleteActionDescriptor extends AbstractAction { public static final int EXIT_CODE = 10; - private DialogWrapper dialogWrapper; + private final DialogWrapper dialog; - public DeleteActionDescriptor() { + public DeleteActionDescriptor(@NotNull DialogWrapper dialog) { super(ResourceBundle.getBundle("messages").getString("action.delete")); + this.dialog = dialog; } @Override public void actionPerformed(ActionEvent e) { - if(dialogWrapper != null) { - dialogWrapper.close(EXIT_CODE, false); - } - } - - @Override - public Action getAction(DialogWrapper dialogWrapper) { - this.dialogWrapper = dialogWrapper; - return this; + dialog.close(EXIT_CODE, false); } } \ No newline at end of file diff --git a/src/main/java/de/marhali/easyi18n/io/IOHandler.java b/src/main/java/de/marhali/easyi18n/io/IOHandler.java index d77ac1f..8a5c814 100644 --- a/src/main/java/de/marhali/easyi18n/io/IOHandler.java +++ b/src/main/java/de/marhali/easyi18n/io/IOHandler.java @@ -1,6 +1,7 @@ package de.marhali.easyi18n.io; import com.intellij.codeInsight.actions.ReformatCodeProcessor; +import com.intellij.openapi.components.PathMacroManager; import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; @@ -57,7 +58,8 @@ public class IOHandler { * @throws IOException Could not read translation data */ public @NotNull TranslationData read() throws IOException { - String localesPath = this.settings.getLocalesDirectory(); + String localesPath = PathMacroManager.getInstance(project) + .expandPath(this.settings.getLocalesDirectory()); if(localesPath == null || localesPath.isEmpty()) { throw new EmptyLocalesDirException("Locales path must not be empty"); diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index e7cdeb8..69ac416 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -25,7 +25,7 @@ settings.preset.tooltip=Choose a configuration template that best fits your proj settings.resource.title=Resource Configuration settings.resource.path.window=Locales Directory settings.resource.path.title=Locales directory -settings.resource.path.tooltip=Define the folder which contains all translation files. For nested folders, use the top folder. +settings.resource.path.tooltip=Choose the folder which contains all translation files. Path variables like $PROJECT_DIR$ are supported. settings.resource.strategy=File structure settings.resource.folder.items=Single Directory;Modularized: Locale / Namespace;Modularized: Namespace / Locale settings.resource.folder.tooltip=What is the folder structure of your translation files?