Skip to content

Commit

Permalink
allow bulk category re-assignment
Browse files Browse the repository at this point in the history
  • Loading branch information
tomcz committed Jan 8, 2024
1 parent d44904c commit 4be0f66
Show file tree
Hide file tree
Showing 4 changed files with 160 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package com.tomczarniecki.jpasskeep;

import com.jgoodies.forms.builder.ButtonBarBuilder;

import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import java.awt.BorderLayout;
import java.awt.Container;

public class AssignCategoriesDialog extends JDialog implements EventListener<AssignCategoriesDialog.Event> {
public enum Event {
SUBMIT, CANCEL;
}

private final MainListController controller;
private final AssignCategoriesModel model;
private boolean success;

public AssignCategoriesDialog(JFrame owner, MainListController controller) {
super(owner, "Assign Categories", true);
this.model = new AssignCategoriesModel(controller.getEntries());
this.controller = controller;

var table = new JTable(this.model);
var columnModel = table.getColumnModel();
var categoryColumn = columnModel.getColumn(1);
var comboBox = new JComboBox<>(Category.values());
categoryColumn.setCellEditor(new DefaultCellEditor(comboBox));

ButtonBarBuilder buttonBar = ButtonBarBuilder.createLeftToRightBuilder();
buttonBar.setDefaultDialogBorder();
buttonBar.addGlue();
buttonBar.addGridded(new JButton(EventAction.create("OK", AssignCategoriesDialog.Event.SUBMIT, this)));
buttonBar.addRelatedGap();
buttonBar.addGridded(new JButton(EventAction.create("Cancel", AssignCategoriesDialog.Event.CANCEL, this)));
buttonBar.addGlue();

Container cc = getContentPane();
cc.setLayout(new BorderLayout());
cc.add(new JScrollPane(table), BorderLayout.CENTER);
cc.add(buttonBar.getPanel(), BorderLayout.SOUTH);
setResizable(false);
pack();
}

public void assign() {
success = false;
setLocationRelativeTo(getOwner());
setVisible(true);
// setVisible(true) blocks until set to false
if (success) {
var entries = controller.getEntries();
for (int i = 0; i < entries.size(); i++) {
var entry = entries.get(i);
var category = model.getCategory(i);
if (entry.getCategory() != category) {
entry.setCategory(category);
controller.updateEntryAt(i, entry);
}
}
}
}

@Override
public void processEvent(Event event) {
switch (event) {
case SUBMIT:
success = true;
setVisible(false);
break;
case CANCEL:
setVisible(false);
break;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.tomczarniecki.jpasskeep;

import javax.swing.table.AbstractTableModel;
import java.util.List;

public class AssignCategoriesModel extends AbstractTableModel {

private static class Pair {
String name;
Category category;
}

private final static String[] columns = {"Name", "Category"};
private final List<Pair> entries;

public AssignCategoriesModel(List<Entry> entries) {
this.entries = entries.stream().map(AssignCategoriesModel::toPair).toList();
}

private static Pair toPair(Entry entry) {
var pair = new Pair();
pair.name = entry.getDescription();
pair.category = entry.getCategory();
return pair;
}

@Override
public String getColumnName(int column) {
return columns[column];
}

@Override
public int getRowCount() {
return entries.size();
}

@Override
public int getColumnCount() {
return columns.length;
}

@Override
public Object getValueAt(int row, int col) {
var pair = entries.get(row);
return (col == 0) ? pair.name : pair.category;
}

public Category getCategory(int row) {
return entries.get(row).category;
}

@Override
public Class<?> getColumnClass(int columnIndex) {
return getValueAt(0, columnIndex).getClass();
}

@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == 1;
}

@Override
public void setValueAt(Object value, int rowIndex, int columnIndex) {
if (columnIndex == 1) {
entries.get(rowIndex).category = (Category) value;
fireTableCellUpdated(rowIndex, columnIndex);
}
}
}
2 changes: 2 additions & 0 deletions src/main/java/com/tomczarniecki/jpasskeep/MainFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,8 @@ private JMenu createViewMenu(MainListController controller, MainDetailsArea deta
viewMenu.add(createToggleItem("Show Work Entries", controller, "showWork", controller.isShowWork()));
viewMenu.add(createToggleItem("Show Other Entries", controller, "showOther", controller.isShowOther()));
viewMenu.addSeparator();
viewMenu.add(createInvokeItem("Assign Categories", new AssignCategoriesDialog(this, controller), "assign"));
viewMenu.addSeparator();
viewMenu.add(createToggleItem("Show Passwords", details, "showPasswd", details.isShowPasswd()));
viewMenu.add(createToggleItem("Show Notes", details, "showNotes", details.isShowNotes()));
viewMenu.addSeparator();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@

public class MainListController {

private JList<Object> display;
private MainListModel model;
private final JList<Object> display;
private final MainListModel model;
private boolean dirty = false;

public MainListController(List<Entry> entries) {
Expand Down Expand Up @@ -83,6 +83,12 @@ public void updateSelectedEntry(Entry update) {
refreshList(index);
}

public void updateEntryAt(int index, Entry entry) {
dirty = true;
model.updateEntry(index, entry);
refreshList(index);
}

public void removeSelectedEntry() {
dirty = true;
int index = getSelectedIndex();
Expand Down

0 comments on commit 4be0f66

Please sign in to comment.