Skip to content
Snippets Groups Projects
Commit d318bf01 authored by Kristyna Fuchsova's avatar Kristyna Fuchsova Committed by Ondřej Hrdlička
Browse files

adds straightforward localization

parent ab6cd79f
No related branches found
No related tags found
2 merge requests!52Final project MR,!47Localization
Showing
with 90 additions and 41 deletions
......@@ -79,6 +79,7 @@ public class Category implements Identifiable {
timeSpents.removeIf(categoryTime -> categoryTime.getTaskId().equals(taskId));
}
//TODO: add support for language structures in localization
private PeriodFormatter createFormatter() {
return new PeriodFormatterBuilder()
.appendDays()
......
......@@ -11,6 +11,7 @@ public enum TaskStatus {
@Override
public String toString() {
String value = this.name().replace("_", " ");
//TODO: solve hardcoded locale of root
return value.charAt(0) + value.substring(1).toLowerCase(Locale.ROOT);
}
......
package cz.muni.fi.pv168.project.model;
import cz.muni.fi.pv168.project.data.category.Category;
import cz.muni.fi.pv168.project.ui.i18n.I18N;
import javax.swing.ListModel;
import javax.swing.event.ListDataEvent;
......@@ -13,6 +14,8 @@ public class CategoryStatisticsTableModel extends AbstractTableModel implements
private LocalDate fromDate;
private LocalDate toDate;
private static final I18N I18N = new I18N(CategoryStatisticsTableModel.class);
public CategoryStatisticsTableModel(ListModel<Category> model) {
fromDate = LocalDate.now();
toDate = LocalDate.now();
......@@ -48,9 +51,9 @@ public class CategoryStatisticsTableModel extends AbstractTableModel implements
public String getColumnName(int columnIndex) {
switch (columnIndex) {
case 0:
return "Category name";
return I18N.getString("columnNameTitle");
case 1:
return "Time spent";
return I18N.getString("columnTimeTitle");
default:
throw new IndexOutOfBoundsException("Invalid column index: " + columnIndex);
}
......
......@@ -2,18 +2,21 @@ package cz.muni.fi.pv168.project.model.db;
import cz.muni.fi.pv168.project.model.EditableModel;
import cz.muni.fi.pv168.project.ui.dialog.error.ErrorDialog;
import cz.muni.fi.pv168.project.ui.i18n.I18N;
import javax.swing.DefaultListModel;
public abstract class AbstractDataModel<E> extends DefaultListModel<E> implements EditableModel<E> {
private static final I18N I18N = new I18N(AbstractDataModel.class);
@Override
public void setElementAt(E element, int index) {
try {
update(element);
} catch (Exception e) {
e.printStackTrace();
ErrorDialog.show("Error when editing " + element, e);
ErrorDialog.show(I18N.getString("editingEntError") + " " + element, e);
}
super.setElementAt(element, index);
}
......@@ -24,7 +27,7 @@ public abstract class AbstractDataModel<E> extends DefaultListModel<E> implement
add(element);
} catch (Exception e) {
e.printStackTrace();
ErrorDialog.show("Error when adding " + element, e);
ErrorDialog.show(I18N.getString("addingEntError") + " " + element, e);
}
super.addElement(element);
......@@ -37,7 +40,7 @@ public abstract class AbstractDataModel<E> extends DefaultListModel<E> implement
delete((E) obj);
} catch (Exception e) {
e.printStackTrace();
ErrorDialog.show("Error when removing " + obj, e);
ErrorDialog.show(I18N.getString("deletingEntError") + " " + obj, e);
}
return super.removeElement(obj);
}
......
......@@ -4,12 +4,15 @@ import cz.muni.fi.pv168.project.data.task.Task;
import cz.muni.fi.pv168.project.db.DataAccessException;
import cz.muni.fi.pv168.project.db.interfaces.DataAccessObject;
import cz.muni.fi.pv168.project.ui.dialog.error.ErrorDialog;
import cz.muni.fi.pv168.project.ui.i18n.I18N;
import java.util.ArrayList;
import java.util.function.Predicate;
public class TaskModel extends UpdatableDataModel<Task> {
private static final I18N I18N = new I18N(TaskModel.class);
public TaskModel(DataAccessObject<Task> dao) {
super(dao);
}
......@@ -26,7 +29,7 @@ public class TaskModel extends UpdatableDataModel<Task> {
addAll(tasks);
} catch (DataAccessException e) {
e.printStackTrace();
ErrorDialog.show("Error when querying all elements.", e);
ErrorDialog.show(I18N.getString("queryAllError"), e);
}
}
}
......@@ -2,11 +2,14 @@ package cz.muni.fi.pv168.project.model.db;
import cz.muni.fi.pv168.project.db.interfaces.DataAccessObject;
import cz.muni.fi.pv168.project.ui.dialog.error.ErrorDialog;
import cz.muni.fi.pv168.project.ui.i18n.I18N;
public class UpdatableDataModel<E> extends AbstractDataModel<E> {
protected final DataAccessObject<E> dataAccessObject;
private static final I18N I18N = new I18N(UpdatableDataModel.class);
public UpdatableDataModel(DataAccessObject<E> dao) {
this.dataAccessObject = dao;
updateAll();
......@@ -33,7 +36,7 @@ public class UpdatableDataModel<E> extends AbstractDataModel<E> {
addAll(dataAccessObject.getAll());
} catch (Exception e) {
e.printStackTrace();
ErrorDialog.show("Error when querying all elements.", e);
ErrorDialog.show(I18N.getString("queryAllError"), e);
}
}
}
package cz.muni.fi.pv168.project.ui.action;
import cz.muni.fi.pv168.project.ui.i18n.I18N;
import cz.muni.fi.pv168.project.ui.main.tab.ListHolder;
import javax.swing.Icon;
......@@ -9,10 +10,12 @@ import java.awt.event.KeyEvent;
public final class AddAction<T> extends AbstractAction<T> {
private static final I18N I18N = new I18N(AddAction.class);
public AddAction(ListHolder<T> listHolder, Icon icon, String description) {
super(listHolder, selectedRowsCount -> true);
putValue(NAME, "Add");
putValue(NAME, I18N.getString("addAction"));
putValue(SMALL_ICON, icon);
putValue(SHORT_DESCRIPTION, description);
putValue(MNEMONIC_KEY, KeyEvent.VK_A);
......@@ -23,7 +26,7 @@ public final class AddAction<T> extends AbstractAction<T> {
public void actionPerformed(ActionEvent e) {
var maybeResult = getDialogFactory()
.newAddDialog()
.show("Add");
.show(I18N.getString("addAction"));
maybeResult.ifPresent(t -> {
listHolder.getModel().addElement(t);
......
package cz.muni.fi.pv168.project.ui.action;
import cz.muni.fi.pv168.project.ui.i18n.I18N;
import cz.muni.fi.pv168.project.ui.main.tab.ListHolder;
import javax.swing.Icon;
......@@ -12,10 +13,12 @@ import java.util.List;
public final class DeleteAction<T> extends AbstractAction<T> {
private static final I18N I18N = new I18N(DeleteAction.class);
public DeleteAction(ListHolder<T> listHolder, Icon icon, String description) {
super(listHolder, selectedRowsCount -> selectedRowsCount >= 1);
putValue(NAME, "Delete");
putValue(NAME, I18N.getString("deleteAction"));
putValue(SMALL_ICON, icon);
putValue(SHORT_DESCRIPTION, description);
putValue(MNEMONIC_KEY, KeyEvent.VK_D);
......@@ -24,7 +27,7 @@ public final class DeleteAction<T> extends AbstractAction<T> {
@Override
public void actionPerformed(ActionEvent e) {
int result = JOptionPane.showConfirmDialog(listHolder.getList(), "Are you sure you want to delete?");
int result = JOptionPane.showConfirmDialog(listHolder.getList(), I18N.getString("confirmation"));
if (result != JOptionPane.OK_OPTION) {
return;
}
......
package cz.muni.fi.pv168.project.ui.action;
import cz.muni.fi.pv168.project.data.task.Task;
import cz.muni.fi.pv168.project.ui.i18n.I18N;
import cz.muni.fi.pv168.project.ui.main.tab.ListHolder;
import org.jetbrains.annotations.Nullable;
......@@ -13,10 +14,11 @@ import java.util.function.Supplier;
public final class EditAction<T> extends AbstractAction<T> {
private static final cz.muni.fi.pv168.project.ui.i18n.I18N I18N = new I18N(EditAction.class);
public EditAction(ListHolder<T> listHolder, Icon icon, String description, @Nullable Supplier<Task> taskSupplier) {
super(listHolder, selectedRowsCount -> selectedRowsCount == 1, taskSupplier);
putValue(NAME, "Edit");
putValue(NAME, I18N.getString("editAction"));
putValue(SMALL_ICON, icon);
putValue(SHORT_DESCRIPTION, description);
putValue(MNEMONIC_KEY, KeyEvent.VK_E);
......@@ -38,7 +40,7 @@ public final class EditAction<T> extends AbstractAction<T> {
var maybeResult = getDialogFactory()
.newEditDialog(list.getSelectedValue())
.show("Edit");
.show(I18N.getString("editAction"));
maybeResult.ifPresent(t -> {
listHolder.getModel().setElementAt(t, listHolder.getModel().indexOf(t));
......
......@@ -2,6 +2,7 @@ package cz.muni.fi.pv168.project.ui.action.task;
import cz.muni.fi.pv168.project.data.task.Task;
import cz.muni.fi.pv168.project.ui.action.AbstractAction;
import cz.muni.fi.pv168.project.ui.i18n.I18N;
import cz.muni.fi.pv168.project.ui.main.tab.ListHolder;
import javax.swing.JList;
......@@ -13,12 +14,13 @@ import java.util.List;
public final class GoToAction extends AbstractAction<Task> {
private final JList<Task> destinationList;
private static final I18N I18N = new I18N(GoToAction.class);
public GoToAction(ListHolder<Task> sourceListHolder, JList<Task> destinationList, String description) {
super(sourceListHolder, selectedRowsCount -> selectedRowsCount == 1);
this.destinationList = destinationList;
putValue(NAME, "Go to task");
putValue(NAME, I18N.getString("goTo"));
putValue(SHORT_DESCRIPTION, description);
putValue(MNEMONIC_KEY, KeyEvent.VK_G);
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl G"));
......
......@@ -3,6 +3,7 @@ package cz.muni.fi.pv168.project.ui.action.task;
import cz.muni.fi.pv168.project.data.task.ITask;
import cz.muni.fi.pv168.project.data.task.Task;
import cz.muni.fi.pv168.project.ui.action.AbstractAction;
import cz.muni.fi.pv168.project.ui.i18n.I18N;
import cz.muni.fi.pv168.project.ui.main.tab.ListHolder;
import org.jetbrains.annotations.Nullable;
......@@ -14,10 +15,12 @@ import java.util.function.Supplier;
public class ToggleCompletionAction<T extends ITask> extends AbstractAction<T> {
private static final I18N I18N = new I18N(ToggleCompletionAction.class);
public ToggleCompletionAction(ListHolder<T> listHolder, String description, @Nullable Supplier<Task> taskSupplier) {
super(listHolder, selectedRowsCount -> selectedRowsCount == 1, taskSupplier);
putValue(NAME, "Toggle completion");
putValue(NAME, I18N.getString("toggleAction"));
putValue(SHORT_DESCRIPTION, description);
putValue(MNEMONIC_KEY, KeyEvent.VK_T);
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl T"));
......
package cz.muni.fi.pv168.project.ui.dialog;
import cz.muni.fi.pv168.project.ui.centering.WindowCenterer;
import cz.muni.fi.pv168.project.ui.i18n.I18N;
import cz.muni.fi.pv168.project.ui.resources.Icons;
import javax.swing.BorderFactory;
......@@ -23,6 +24,8 @@ abstract class AbstractEntityDialog<E> extends JDialog {
private final JPanel panel;
private final JButton okButton;
private static final I18N I18N = new I18N(AbstractEntityDialog.class);
private boolean wasOk;
AbstractEntityDialog() {
......@@ -30,12 +33,12 @@ abstract class AbstractEntityDialog<E> extends JDialog {
panel.setLayout(new GridBagLayout());
wasOk = false;
okButton = new JButton("OK");
okButton = new JButton(I18N.getString("buttonConfirm"));
okButton.addActionListener(e -> {
wasOk = true;
this.dispose();
});
JButton cancelButton = new JButton("Cancel");
JButton cancelButton = new JButton(I18N.getString("buttonDismiss"));
cancelButton.addActionListener(e -> this.dispose());
GridBagConstraints gbc = new GridBagConstraints();
......@@ -54,7 +57,7 @@ abstract class AbstractEntityDialog<E> extends JDialog {
gbc.gridx = 2;
okCancelPanel.add(cancelButton, gbc);
this.setTitle("New filesystem VM");
this.setTitle(I18N.getString("vmTitle"));
this.setMinimumSize(new Dimension(300, 100));
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setModalityType(ModalityType.APPLICATION_MODAL);
......
......@@ -3,6 +3,7 @@ package cz.muni.fi.pv168.project.ui.dialog;
import cz.muni.fi.pv168.project.color.AppColors;
import cz.muni.fi.pv168.project.data.category.Category;
import cz.muni.fi.pv168.project.ui.component.SimpleColorChooser;
import cz.muni.fi.pv168.project.ui.i18n.I18N;
import javax.swing.JLabel;
import javax.swing.JTextField;
......@@ -16,6 +17,8 @@ public class CategoryDialog extends AbstractLaidOutDialog<Category> {
private final SimpleColorChooser colorField = new SimpleColorChooser();
private final JLabel colorCodeField = new JLabel();
private static final I18N I18N = new I18N(CategoryDialog.class);
public CategoryDialog() {
colorCodeField.setText("#FFFFFF");
colorField.getSelectionModel().addChangeListener(
......@@ -34,8 +37,8 @@ public class CategoryDialog extends AbstractLaidOutDialog<Category> {
}
private void addFields() {
addLabeledField("Name:", nameField, labelGbc, componentGbc, getRowThenIncrement());
addLabeledField("Color:", colorField, labelGbc, componentGbc, getRowThenIncrement());
addLabeledField(I18N.getString("fieldLabelName"), nameField, labelGbc, componentGbc, getRowThenIncrement());
addLabeledField(I18N.getString("fieldLabelColor"), colorField, labelGbc, componentGbc, getRowThenIncrement());
var colorCodeGbc = (GridBagConstraints) labelGbc.clone();
colorCodeGbc.fill = GridBagConstraints.CENTER;
......
package cz.muni.fi.pv168.project.ui.dialog;
import cz.muni.fi.pv168.project.model.ComboBoxModelAdapter;
import cz.muni.fi.pv168.project.ui.i18n.I18N;
import javax.swing.JComboBox;
import java.util.Collection;
......@@ -8,10 +9,11 @@ import java.util.Collection;
public class ComboBoxDialog<T> extends AbstractLaidOutDialog<T> {
private final JComboBox<T> comboBox;
private static final I18N I18N = new I18N(ComboBoxDialog.class);
public ComboBoxDialog(Collection<T> entities) {
comboBox = new JComboBox<>(ComboBoxModelAdapter.fromCollection(entities));
addLabeledField("Select :", comboBox, labelGbc, middleComponent, getRow());
addLabeledField(I18N.getString("fieldLabelSelect"), comboBox, labelGbc, middleComponent, getRow());
// gray out button when nothing is initially selected
getOkButton().setEnabled(false);
......
package cz.muni.fi.pv168.project.ui.dialog;
import cz.muni.fi.pv168.project.data.task.SubTask;
import cz.muni.fi.pv168.project.ui.i18n.I18N;
import javax.swing.JTextField;
......@@ -9,6 +10,8 @@ public class SubTaskDialog extends AbstractLaidOutDialog<SubTask> {
protected SubTask entity;
protected final JTextField titleField = new JTextField();
private static final I18N I18N = new I18N(SubTaskDialog.class);
public SubTaskDialog() {
entity = new SubTask("");
this.addTitle();
......@@ -23,7 +26,7 @@ public class SubTaskDialog extends AbstractLaidOutDialog<SubTask> {
}
protected void addTitle() {
addLabeledField("Title:", titleField, labelGbc, componentGbc, getRowThenIncrement());
addLabeledField(I18N.getString("fieldLabelTitle"), titleField, labelGbc, componentGbc, getRowThenIncrement());
}
@Override
......
......@@ -2,6 +2,7 @@ package cz.muni.fi.pv168.project.ui.dialog;
import cz.muni.fi.pv168.project.data.task.Task;
import cz.muni.fi.pv168.project.model.LocalDateModel;
import cz.muni.fi.pv168.project.ui.i18n.I18N;
import org.jdatepicker.DateModel;
import org.jdatepicker.JDatePicker;
import org.joda.time.Duration;
......@@ -31,6 +32,8 @@ public class TaskDialog extends AbstractLaidOutDialog<Task> {
private final JTextField estimatedTimeField = new IntegerTextField(0);
private final JDatePicker datePicker = new JDatePicker(dueTimeModel);
private static final I18N I18N = new I18N(TaskDialog.class);
public TaskDialog() {
descriptionField.setLineWrap(true);
descriptionField.setFont(descriptionField.getFont().deriveFont(11f));
......@@ -45,17 +48,17 @@ public class TaskDialog extends AbstractLaidOutDialog<Task> {
}
protected void addFields() {
addLabeledField("Title:", titleField, labelGbc, componentGbc, getRowThenIncrement());
addLabeledField("Description:", new JScrollPane(descriptionField), labelGbc, componentGbc, getRowThenIncrement());
addLabeledField("Estimated time:", createEstimatedTimePanel(), labelGbc, componentGbc, getRowThenIncrement());
addLabeledField("Due time:", datePicker, labelGbc, componentGbc, getRowThenIncrement());
addLabeledField(I18N.getString("labelTitle"), titleField, labelGbc, componentGbc, getRowThenIncrement());
addLabeledField(I18N.getString("labelDescription"), new JScrollPane(descriptionField), labelGbc, componentGbc, getRowThenIncrement());
addLabeledField(I18N.getString("labelEstTime"), createEstimatedTimePanel(), labelGbc, componentGbc, getRowThenIncrement());
addLabeledField(I18N.getString("labelDueTime"), datePicker, labelGbc, componentGbc, getRowThenIncrement());
}
private JPanel createEstimatedTimePanel() {
JPanel estimatePanel = new JPanel(new BorderLayout());
estimatePanel.add(estimatedTimeField, BorderLayout.CENTER);
estimatePanel.add(new JLabel(" hours"), BorderLayout.EAST);
estimatePanel.add(new JLabel(" " + I18N.getString("estimatedTimeUnit")), BorderLayout.EAST);
return estimatePanel;
}
......
package cz.muni.fi.pv168.project.ui.dialog.error;
import cz.muni.fi.pv168.project.ui.i18n.I18N;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
......@@ -15,6 +16,7 @@ import java.io.StringWriter;
public final class ErrorDialog {
private final JPanel panel = new JPanel();
private static final I18N I18N = new I18N(ErrorDialog.class);
private ErrorDialog(String message, Throwable throwable) {
panel.setLayout(new GridBagLayout());
......@@ -39,7 +41,7 @@ public final class ErrorDialog {
private void show(Component parentComponent) {
JOptionPane.showMessageDialog(parentComponent,
panel,
"Error occurred",
I18N.getString("error"),
JOptionPane.ERROR_MESSAGE);
}
......
package cz.muni.fi.pv168.project.ui.main.panel;
import cz.muni.fi.pv168.project.ui.i18n.I18N;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JTextArea;
......@@ -13,11 +15,9 @@ import java.awt.Font;
public class WelcomePanel {
private final JPanel panel;
private static final String WELCOME_MESSAGE =
"Welcome to to:do, your daily task reminder.\n" + "\n" +
"You can use the toolbar buttons above to add, edit, or delete tasks and categories.\n" +
"Switch between tasks and categories using the tabs.\n" +
"Click on a task in the list on the left to see details.";
private static final I18N I18N = new I18N(WelcomePanel.class);
private static final String WELCOME_MESSAGE = I18N.getString("welcomeMessage");
public WelcomePanel() {
var welcomeTextArea = new JTextArea(WELCOME_MESSAGE);
......
......@@ -9,6 +9,7 @@ import cz.muni.fi.pv168.project.ui.action.DeleteAction;
import cz.muni.fi.pv168.project.ui.action.EditAction;
import cz.muni.fi.pv168.project.ui.dialog.factory.DialogFactory;
import cz.muni.fi.pv168.project.ui.dialog.factory.ExistingCategoryDialogFactory;
import cz.muni.fi.pv168.project.ui.i18n.I18N;
import cz.muni.fi.pv168.project.ui.popup.PopupMenuFactory;
import cz.muni.fi.pv168.project.ui.renderer.list.InnerColoredListRenderer;
import cz.muni.fi.pv168.project.ui.resources.Icons;
......@@ -20,17 +21,19 @@ public class CategoryHolderPanel extends AbstractHolderPanel<Category> {
private final ExistingCategoryDialogFactory factory;
private static final I18N I18N = new I18N(CategoryHolderPanel.class);
public CategoryHolderPanel(TaskCategoryDao categoryDao, CategoryDao parentDao) {
super(
new TaskCategoryModel(categoryDao, parentDao), "Categories",
new TaskCategoryModel(categoryDao, parentDao), I18N.getString("panelName"),
new InnerColoredListRenderer<>(Category::getName, Category::getColor, Font.BOLD | Font.ITALIC),
Optional.empty());
factory = new ExistingCategoryDialogFactory(parentDao);
PopupMenuFactory.builder()
.addMenuItem(new AddAction<>(this, Icons.ADD_CATEGORY_ICON, "Add category").addUpdatable(this))
.addMenuItem(new EditAction<>(this, Icons.EDIT_CATEGORY_ICON, "Edit category").addUpdatable(this))
.addMenuItem(new DeleteAction<>(this, Icons.REMOVE_CATEGORY_BIN_ICON, "Remove category").addUpdatable(this))
.addMenuItem(new AddAction<>(this, Icons.ADD_CATEGORY_ICON, I18N.getString("addCategoryOption")).addUpdatable(this))
.addMenuItem(new EditAction<>(this, Icons.EDIT_CATEGORY_ICON, I18N.getString("editCategoryOption")).addUpdatable(this))
.addMenuItem(new DeleteAction<>(this, Icons.REMOVE_CATEGORY_BIN_ICON, I18N.getString("removeCategoryOption")).addUpdatable(this))
.buildFor(this.getList());
}
......
......@@ -9,6 +9,7 @@ import cz.muni.fi.pv168.project.ui.action.DeleteAction;
import cz.muni.fi.pv168.project.ui.action.task.GoToAction;
import cz.muni.fi.pv168.project.ui.dialog.factory.DependencyTaskDialogFactory;
import cz.muni.fi.pv168.project.ui.dialog.factory.DialogFactory;
import cz.muni.fi.pv168.project.ui.i18n.I18N;
import cz.muni.fi.pv168.project.ui.popup.PopupMenuFactory;
import cz.muni.fi.pv168.project.ui.renderer.list.TaskStatusListRenderer;
import cz.muni.fi.pv168.project.ui.resources.Icons;
......@@ -21,19 +22,21 @@ public class DependencyHolderPanel extends AbstractHolderPanel<Task> {
private final DependencyTaskDialogFactory factory;
private static final I18N I18N = new I18N(DependencyHolderPanel.class);
public DependencyHolderPanel(JList<Task> superiorTaskList, DependencyDao dependencyDao, TaskDao taskDao) {
super(
new TaskDependencyModel(dependencyDao), "Dependencies",
new TaskDependencyModel(dependencyDao), I18N.getString("panelName"),
new TaskStatusListRenderer<>(Task::getTitle, Task::getTaskStatus, Task::isUrgent, Font.PLAIN),
Optional.of(Task::isCompleted)
);
factory = new DependencyTaskDialogFactory(dependencyDao, taskDao);
PopupMenuFactory.builder()
.addMenuItem(new GoToAction(this, superiorTaskList, "Go to dependency"))
.addMenuItem(new GoToAction(this, superiorTaskList, I18N.getString("goToAction")))
.addSeparator()
.addMenuItem(new AddAction<>(this, Icons.ADD_TASK_ICON, "Add dependency").addUpdatable(this))
.addMenuItem(new DeleteAction<>(this, Icons.REMOVE_TASK_BIN_ICON, "Remove dependency").addUpdatable(this))
.addMenuItem(new AddAction<>(this, Icons.ADD_TASK_ICON, I18N.getString("addAction")).addUpdatable(this))
.addMenuItem(new DeleteAction<>(this, Icons.REMOVE_TASK_BIN_ICON, I18N.getString("removeAction")).addUpdatable(this))
.buildFor(this.getList());
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment