Skip to content

Commit

Permalink
Finished settings menu
Browse files Browse the repository at this point in the history
  • Loading branch information
SandroHc committed Dec 22, 2019
1 parent 8e6570d commit ed84633
Show file tree
Hide file tree
Showing 7 changed files with 209 additions and 61 deletions.
Binary file modified images/settings.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
71 changes: 50 additions & 21 deletions src/pa/iscde/minimap/internal/MinimapView.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
public class MinimapView implements PidescoView {

private static final Logger LOGGER = Logger.getLogger(MinimapView.class);

public static final String VIEW_ID = "pt.iscte.pidesco.minimap.minimap";
public static final String EXT_POINT_INSPECTION = "pt.iscte.pidesco.minimap.inspection";

Expand All @@ -58,6 +59,8 @@ public class MinimapView implements PidescoView {
private final Collection<Extension> extensions;
private final Collection<ExtensionRule> activeRules;

private File activeFile = null;

/* SWT Components */
private Composite root;
private ScrolledComposite scroll;
Expand Down Expand Up @@ -93,7 +96,15 @@ private void loadInspections() {
this.extensions.add(extension);
this.activeRules.addAll(extension.rules);

extension.rules.forEach(rule -> SettingsManager.isEnabled(rule.id));
// Load rule stat
for (ExtensionRule rule : extension.rules) {
if (rule.isErrored()) {
rule.setEnabled(false);
SettingsManager.setEnabled(rule);
} else {
rule.setEnabled(SettingsManager.isEnabled(rule));
}
}
} catch (Exception e) {
LOGGER.error("Error loading extension '" + ext.getSimpleIdentifier() + "'", e);
}
Expand Down Expand Up @@ -163,43 +174,61 @@ public Composite getRoot() {
return root;
}

private class Listener implements JavaEditorListener {
public Collection<Extension> getExtensions() {
return extensions;
}

@Override
public void fileOpened(File file) {
LOGGER.info("File opened: " + file);
public File getActiveFile() {
return activeFile;
}

public void parseFile(File file) {
this.activeFile = file;

// TODO: do this in a worker thread
// TODO: implement way to enable/disable rules
Collection<MinimapLine> lines = new MinimapFile(file).parse(javaEditorServices, activeRules);
if (file == null) {
this.scroll.getContent().dispose();
return;
}

createScrollComponent(lines);
// TODO: do this in a worker thread
// TODO: implement way to enable/disable rules
Collection<MinimapLine> lines = new MinimapFile(file).parse(javaEditorServices, activeRules);

createScrollComponent(lines);

// StyledText text = new StyledText(scroll, SWT.BORDER);
// text.setText("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
// StyledText text = new StyledText(scroll, SWT.BORDER);
// text.setText("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
//
// FontData data = text.getFont().getFontData()[0];
// Font font1 = new Font(scroll.getDisplay(), data.getName(), data.getHeight(), data.getStyle());
// FontData data = text.getFont().getFontData()[0];
// Font font1 = new Font(scroll.getDisplay(), data.getName(), data.getHeight(), data.getStyle());
//
// StyleRange style1 = new StyleRange();
// style1.start = 0;
// style1.length = 10;
// style1.fontStyle = SWT.BOLD;
// style1.font = font1;
// style1.background = Colors.PURPLE;
// text.setStyleRange(style1);
// StyleRange style1 = new StyleRange();
// style1.start = 0;
// style1.length = 10;
// style1.fontStyle = SWT.BOLD;
// style1.font = font1;
// style1.background = Colors.PURPLE;
// text.setStyleRange(style1);
}

private class Listener implements JavaEditorListener {

@Override
public void fileOpened(File file) {
LOGGER.info("File opened: " + file);
parseFile(file);
}

@Override
public void fileClosed(File file) {
LOGGER.debug("File closed: " + file);
parseFile(null);
}

@Override
public void fileSaved(File file) {
LOGGER.debug("File saved: " + file);
// TODO reload/reparse file
parseFile(file);
}
}

Expand Down
130 changes: 111 additions & 19 deletions src/pa/iscde/minimap/internal/SettingsDialog.java
Original file line number Diff line number Diff line change
@@ -1,21 +1,25 @@
package pa.iscde.minimap.internal;

import org.apache.log4j.Logger;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import pa.iscde.minimap.internal.extension.Extension;
import pa.iscde.minimap.internal.extension.ExtensionRule;

public class SettingsDialog extends TitleAreaDialog {

private Text txtFirstName;
private static final Logger LOGGER = Logger.getLogger(SettingsDialog.class);

private Tree tree;

private String firstName;

/**
* Instantiate a new title area dialog.
Expand All @@ -29,33 +33,112 @@ public SettingsDialog(Shell parentShell) {
@Override
public void create() {
super.create();
setTitle("Custom dialog");
setMessage("This is a TitleAreaDialog", IMessageProvider.INFORMATION);
setTitle("Settings");
setMessage("Enable your desired inspection rules.", IMessageProvider.NONE);
}

@Override
protected Control createDialogArea(Composite parent) {
Composite area = (Composite) super.createDialogArea(parent);
Composite container = new Composite(area, SWT.NONE);
container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
GridLayout layout = new GridLayout(2, false);
container.setLayout(layout);
container.setLayout(new GridLayout(1, false));

createFirstName(container);
tree = new Tree(container, SWT.CHECK | SWT.BORDER);
tree.setLayoutData(container.getLayoutData());
fillTree(tree);

return area;
}

private void createFirstName(Composite container) {
Label lbtFirstName = new Label(container, SWT.NONE);
lbtFirstName.setText("First Name");
/**
* Helper method to fill a tree with data
*
* @param tree the tree to fill
*/
private void fillTree(Tree tree) {
// Turn off drawing to avoid flicker
tree.setRedraw(false);

tree.addListener(SWT.Selection, event -> {
TreeItem item = (TreeItem) event.item;
LOGGER.debug((event.detail == SWT.CHECK ? "CHECK" : "SELECT") + " EVENT: " + item);

if (event.detail != SWT.CHECK) {
return;
}

// Set checked state for himself and all it's children
setCheckedState(item, item.getChecked());

// Refresh checked state for it's parent
if (item.getParentItem() != null) {
item.getParentItem().setChecked(getCheckedState(item.getParentItem()));
}
});

for (Extension ext : MinimapView.getInstance().getExtensions()) {
TreeItem item = new TreeItem(tree, SWT.NONE);
item.setText(ext.name + " [" + ext.id + ']');
item.setData(ext);
item.setExpanded(true);

for (ExtensionRule rule : ext.rules) {
TreeItem child = new TreeItem(item, SWT.NONE);
child.setText(rule.name + " [" + rule.id + ']');
child.setData(rule);

if (rule.isErrored()) {
child.setGrayed(true);
child.setChecked(false);
} else {
child.setChecked(SettingsManager.isEnabled(rule));
}
}

item.setChecked(getCheckedState(item));
}

tree.setRedraw(true);
}

private void setCheckedState(TreeItem item, boolean checked) {
item.setChecked(checked);
for (TreeItem child : item.getItems()) {
setCheckedState(child, checked);
}
}

/**
* Find the checked state based on it's children's state.
*
* @param item The item to find the checked state
* @return {@code true} if at least one of it's children is checked, {@code false} otherwise
*/
private boolean getCheckedState(TreeItem item) {
if (item.getItems().length < 1) {
return item.getChecked();
}

GridData dataFirstName = new GridData();
dataFirstName.grabExcessHorizontalSpace = true;
dataFirstName.horizontalAlignment = GridData.FILL;
for (TreeItem child : item.getItems()) {
if (getCheckedState(child)) {
return true;
}
}

txtFirstName = new Text(container, SWT.BORDER);
txtFirstName.setLayoutData(dataFirstName);
return false;
}

private void save(TreeItem item) {
if (item.getData() instanceof ExtensionRule) {
ExtensionRule rule = (ExtensionRule) item.getData();
rule.setEnabled(item.getChecked());
SettingsManager.setEnabled(rule);
}

for (TreeItem child : item.getItems()) {
save(child);
}
}

@Override
Expand All @@ -65,9 +148,18 @@ protected void cancelPressed() {

@Override
protected void okPressed() {
firstName = txtFirstName.getText();
for (TreeItem item : tree.getItems()) {
save(item);
}

boolean changed = SettingsManager.save();

if (changed) {
MinimapView view = MinimapView.getInstance();
view.parseFile(view.getActiveFile());
}

super.okPressed();
SettingsManager.save();
}

@Override
Expand Down
30 changes: 22 additions & 8 deletions src/pa/iscde/minimap/internal/SettingsManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@
import java.util.stream.Collectors;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import org.apache.log4j.Logger;
import pa.iscde.minimap.internal.extension.ExtensionRule;

public class SettingsManager {

Expand All @@ -22,7 +24,7 @@ public class SettingsManager {
/** path in which the settings file is stored */
private static final Path SETTINGS_PATH = Paths.get("minimap.ini");

private static final Gson GSON = new Gson();
private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
private static final Type SETTINGS_TYPE = new TypeToken<Map<String, Boolean>>(){}.getType();

/** the state that new extension rules will have */
Expand All @@ -49,10 +51,10 @@ public static void load() {
}
}

public static void save() {
public static boolean save() {
if (!dirty) {
LOGGER.debug("Settings unchanged");
return;
return false;
}

try {
Expand All @@ -67,17 +69,29 @@ public static void save() {
dirty = false;
LOGGER.info("Saved settings for " + settings.size() + " rules");
}

return true;
}

public static boolean isEnabled(String ruleId) {
return settings.computeIfAbsent(ruleId, key -> {
public static boolean isEnabled(ExtensionRule rule) {
if (rule == null) {
return false;
}

return settings.computeIfAbsent(rule.id, key -> {
dirty = true;
return DEFAULT_STATE;
});
}

public static void setEnabled(String ruleId, boolean enabled) {
settings.put(ruleId, enabled);
dirty = true;
public static void setEnabled(ExtensionRule rule) {
if (rule == null) {
return;
}

Boolean prev = settings.put(rule.id, rule.isEnabled());

// Only mark dirty if the value changed
dirty |= !((Boolean) rule.isEnabled()).equals(prev);
}
}
14 changes: 5 additions & 9 deletions src/pa/iscde/minimap/internal/SettingsTool.java
Original file line number Diff line number Diff line change
@@ -1,29 +1,25 @@
package pa.iscde.minimap.internal;


import org.apache.log4j.Logger;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.MessageBox;
import pt.iscte.pidesco.extensibility.PidescoTool;

public class SettingsTool implements PidescoTool {

private static final Logger LOGGER = Logger.getLogger(SettingsTool.class);

@Override
public void run(boolean selected) {
// Activator.getContext();
// ProjectBrowserActivator.getInstance().refreshWorkspace();

MinimapView minimap = MinimapView.getInstance();

SettingsDialog dialog = new SettingsDialog(minimap.getRoot().getShell());
int returnCode = dialog.open();

if (returnCode == IDialogConstants.OK_ID) {
System.out.println("OK clicked");
LOGGER.debug("OK clicked");
} else if (returnCode == IDialogConstants.CANCEL_ID) {
System.out.println("CANCEL clicked");
} else {
System.out.println("UNK: " + returnCode);
LOGGER.debug("CANCEL clicked");
}
}

Expand Down
Loading

0 comments on commit ed84633

Please sign in to comment.