ConExp-NG is a simple GUI-centric tool for the study & research of Formal Concept Analysis (FCA) that allows you to create formal contexts, draw concept lattices and explore dependencies between attributes.
Analogous to ConExp's Expert Mode for fast editing of contexts but extended, create a shortcut concept and its corresponding implementation of an Expert Mode for ConExpNG.
In my opinion this shortcut concept should mimic VIM's unique mode of editing. E.g.
hjkl moves the active cell through the context,
L toggles the current cell and moves to the right cell or to the first cell in the next row,
J toggles the current cell and moves to the cell below or to the first cell in the next column,
...
g / G jumps to the first/last object,
0 / $ jumps to the first/last attribute,
d / D removes the current object/attribute,
o / O adds a new object below/above the currently selected row and lets the user input an corresponding name,
...
shortcuts for selections, renaming
click on an attributename or object to select only the row or column
select other entries by shift+arrowkeys
moving attribute or object by ctrl +arrowkeys
renaming by r/R for object/attribute
click on the first cell to select all
...
Since creating the ConExp-mimicking context editor from scratch was enough work as it is, I did not invest much time into the implementation of an expert mode although I believe it would be worthwhile to have it.
Don't forget to provide an explanation of the various shortcuts in the User Guide!
Put state.contextChanged (like in 0e0bf15) in all the appropriate places so that other parts of the program register when something about the context changes.
ConExp's context editor has the option to show arrow relations in the context editor. Provide a togglebutton in the toolbar with the same functionality.
We should use some evaluation techniques (e.g. heuristic evaluation) for ConExp's GUI in order to find problems we don't want to recreate and in order to create a better mockup for our new GUI. To that end, we should also obtain a list from Mr.Jäschke in which he describes his personal gripes with ConExp.
I think the document tree is out of place. Can there be several roots, i.e. can you have several files opened at the same time? Can a file have more than one context? To both questions the answer is no. It seems to me that this tree representation is superfluous and a much simpler representation would get the job done much better.
This yet-to-be-conceived representation does only have to offer the following capabilities:
Show filename (although even this could be shown somewhere else)
Show the list of lattice views (btw: they should be renameable)
Show links to calculated implications/associations (although even this bould be shown somewhere else)
Allow reordering objects/attributes e.g. by dragging the corresponding header cell. Also provide keyboard shortcuts for moving rows/columns around. Don't forget to update the user guide.
First of all, it should be possible to only resize the objects column, e.g. it makes sense if your objects have long names. To this end, if the mouse is over the vertical line of the first column transform mouse button to resizer and allow resizing while dragging.
Then, it also makes sense to allow resizing of the other columns if the attribute names are long. But for consistency, all attribute columns should always have the same length. Provide the the resizer interaction but only in the attribute header cells.
Note, the column width should be saved in the program state and ideally also in the saved file.
ConExp has cut/copy/paste options in the context menu for selections inside the matrix. Currently, these menu entries do nothing. Implement the functionality (it won't be very trivial to be honest).
ConExp only supports unary formal contexts. It would be great to support the creation of many-valued formal contexts where the input of ordinal or scalar data is possible.
Note: Mr.Jäschke suggested that these many-valued inputs could be transformed into binary inputs internally? If possible this reduction would probably make the implementation easier. See also slide 24 of Introduction to FCA ICFCA2004: "The process of creating single-valued contexts from a many-valued data set is called conceptual scaling."
How to handle this problem GUI-wise?
The Elba User Manual provides an illustrated GUI-flow of working with many-valued contexts.
The program SPSS provides a way to enter many-valued data.
If the user tries to exit the application while having unsaved changes a dialog, like in every other GUI, should pop up reminding the user of this fact and providing appropriate actions.
... or at least so modular that it can easily be exchanged by another algorithm. In particular, the algorithm should have no dependency to the GUI (Swing) classes (and vice versa).
The idea to have it as a separate library would be that other developers could easily re-use it.
Put state.contextChanged (like in 0e0bf15) in all the appropriate places so that other parts of the program register when something about the context changes.
Remove unnecessary batik dependencies from pom.xml. Currently, I've just added every batik lib I could find just to be sure but I'm positive that we are only going to use a tiny fraction of these.
IIRC, one can style style SVG files with an CSS-like language. It would be cool, if we had the ability to choose from several styles. E.g. one basic style and one Latex-like style. Then Tikz-Export would be superfluous, imho. Maybe we could even discover css files in certain locations (folder, where ConExpNG.jar resides and ConExpNG settings directory) and if found, present these additional styles as an option in the GUI.
Include a folder examples that contains several examplary contexts as xml files. Their purpose is twofold. For one, they serve as examples for the users. On the other hand, we can repurpose them for internal testing.
I believe it would be great, especially for bigger contexts, if both the attribute header row and the object header column would stay visible at all times. When scrolling horizontally, the attribute header row would scroll horizontally, too, and when scrolling vertically, the object header columns would scroll vertically, too.
Hier noch mal die Use Cases (dann muss man nicht immer in der Dropbox nachschauen), die meines Erachtens umgesetzt werden sollten. Jedoch habe ich noch keine Sortierung nach Priorität reingebracht.
Use-Cases:
Neue Datei erstellen
Datei öffnen
Datei speichern
Programm schließen (extend "Datei speichern")
Anzahl der formalen Begriff berechen (nötig?)
Objekten Attribute zuweisen / Attributen Objekte zu weisen
Import of ConExp files must be possible! Backwards compatibility! Everything else would be bad, as users would somehow need to (manually) recreate their potentially large contexts. We can't expect users to do this.
Structure the code in a way so that it is easy to add new layout algorithms. To that end implement at least two different layout algorithms and try to extract an abstract interface from them. In addition, provide a section in the developer guide that explains how to add a new layout algorithm as the addition of a new layout algorithm will probably not only entail the implementation of the algorithm per se but also the addition of GUI code which allows to adjust certain layout parameters.
As we did for ConExp we should test the usability of our new GUI so that we find possible problems as soon as possible.
Also, we should check that our reimagined imitation of ConExp does indeed provide all of ConExp's orginial functionality by going through this list and ConExp's documentation.
We must find a way to introduce this functionality. Problem ist, we decided not to have a traditional menu. Ideas:
Another button next to open files that stands for "open a recent file" (maybe folder symbol with a clock) that opens a list of say the 5 last opened files from which you can choose which to open
Displaying a small arrow on the "open folder" button (like "run" in eclipse) that, when clicked, opened a list or recently opened files