Commit 30714eee authored by Alexander Weigl's avatar Alexander Weigl
Browse files

A lot of simplifications

parent 2a2cdfb5
Pipeline #11955 failed with stage
in 1 minute and 21 seconds
...@@ -8,6 +8,7 @@ package edu.kit.formal.gui; ...@@ -8,6 +8,7 @@ package edu.kit.formal.gui;
import de.uka.ilkd.key.util.KeYConstants; import de.uka.ilkd.key.util.KeYConstants;
import javafx.application.Application; import javafx.application.Application;
import javafx.application.Platform;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.scene.Parent; import javafx.scene.Parent;
import javafx.scene.Scene; import javafx.scene.Scene;
...@@ -39,6 +40,7 @@ public class ProofScriptDebugger extends Application { ...@@ -39,6 +40,7 @@ public class ProofScriptDebugger extends Application {
Parent root = fxmlLoader.load(); Parent root = fxmlLoader.load();
//DebuggerMainWindowController controller = fxmlLoader.<DebuggerMainWindowController>getController(); //DebuggerMainWindowController controller = fxmlLoader.<DebuggerMainWindowController>getController();
Scene scene = new Scene(root); Scene scene = new Scene(root);
primaryStage.setOnCloseRequest(event -> Platform.exit());
scene.getStylesheets().addAll( scene.getStylesheets().addAll(
getClass().getResource("debugger-ui.css").toExternalForm(), getClass().getResource("debugger-ui.css").toExternalForm(),
DockNode.class.getResource("default.css").toExternalForm() DockNode.class.getResource("default.css").toExternalForm()
...@@ -55,10 +57,14 @@ public class ProofScriptDebugger extends Application { ...@@ -55,10 +57,14 @@ public class ProofScriptDebugger extends Application {
logger.info("KeY Internal: " + KeYConstants.INTERNAL_VERSION); logger.info("KeY Internal: " + KeYConstants.INTERNAL_VERSION);
//logger.error("sfklsajflksajfsdajfsdalfjsdaf", new IllegalAccessError("dlfsdalfjsadflj")); //logger.error("sfklsajflksajfsdajfsdalfjsdaf", new IllegalAccessError("dlfsdalfjsadflj"));
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
}
@Override
public void stop() throws Exception {
System.exit(0);//needed, else non-termination of process
} }
} }
...@@ -12,6 +12,7 @@ import javafx.stage.Modality; ...@@ -12,6 +12,7 @@ import javafx.stage.Modality;
import lombok.Getter; import lombok.Getter;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.util.List;
/** /**
* A Contract Chooser is a modal dialog, which shows a list of contracts and lets the user select one. * A Contract Chooser is a modal dialog, which shows a list of contracts and lets the user select one.
...@@ -66,6 +67,11 @@ public class ContractChooser extends Dialog<Contract> { ...@@ -66,6 +67,11 @@ public class ContractChooser extends Dialog<Contract> {
listOfContractsView.itemsProperty().bind(contracts); listOfContractsView.itemsProperty().bind(contracts);
} }
public ContractChooser(Services service, List<Contract> contracts) {
this(service);
listOfContractsView.itemsProperty().get().setAll(contracts);
}
public MultipleSelectionModel<Contract> getSelectionModel() { public MultipleSelectionModel<Contract> getSelectionModel() {
return selectionModel; return selectionModel;
} }
......
package edu.kit.formal.gui.controller;
import edu.kit.formal.gui.controls.Utils;
import edu.kit.formal.gui.model.RootModel;
import edu.kit.formal.interpreter.data.GoalNode;
import edu.kit.formal.interpreter.data.KeyData;
import javafx.beans.property.SimpleListProperty;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.TextArea;
import javafx.scene.layout.VBox;
import java.io.IOException;
/**
* Created by sarah on 5/27/17.
*/
public class ListGoalView extends VBox {
protected SimpleListProperty<GoalNode<KeyData>> localGoalListProperty = new SimpleListProperty<>();
@FXML
private ListView<GoalNode<KeyData>> listOfGoalsView;
@FXML
private TextArea goalNodeView;
private RootModel rootModel;
public ListGoalView() {
Utils.createWithFXML(this);
listOfGoalsView.setCellFactory(list -> new GoalNodeCell());
}
public void setRootModel(RootModel rootModel) {
this.rootModel = rootModel;
}
/**
* Set Bindings and listener
*/
/* public void init() {
listOfGoalsView.itemsProperty().bind(this.rootModel.currentGoalNodesProperty());
listOfGoalsView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<GoalNode<KeyData>>() {
@Override
public void changed(ObservableValue<? extends GoalNode<KeyData>> observable, GoalNode<KeyData> oldValue, GoalNode<KeyData> newValue) {
goalNodeView.setText(newValue.toCellTextForKeYData());
}
});
}
*/
private static class GoalNodeCell extends ListCell<GoalNode<KeyData>> {
@Override
protected void updateItem(GoalNode<KeyData> item, boolean empty) {
super.updateItem(item, empty);
if (item != null) {
setText(item.toListLabelForKeYData());
}
}
}
}
package edu.kit.formal.gui.controls; package edu.kit.formal.gui.controls;
import edu.kit.formal.gui.model.InspectionModel; import edu.kit.formal.gui.model.InspectionModel;
import edu.kit.formal.gui.model.RootModel;
import edu.kit.formal.interpreter.data.GoalNode; import edu.kit.formal.interpreter.data.GoalNode;
import edu.kit.formal.interpreter.data.KeyData; import edu.kit.formal.interpreter.data.KeyData;
import javafx.beans.Observable; import javafx.beans.Observable;
...@@ -20,7 +19,7 @@ import javafx.scene.layout.BorderPane; ...@@ -20,7 +19,7 @@ import javafx.scene.layout.BorderPane;
* *
* @author S. Grebing * @author S. Grebing
*/ */
public class InspectionViewTab extends BorderPane { public class InspectionView extends BorderPane {
public GoalOptionsMenu goalOptionsMenu = new GoalOptionsMenu(); public GoalOptionsMenu goalOptionsMenu = new GoalOptionsMenu();
@FXML @FXML
...@@ -33,8 +32,7 @@ public class InspectionViewTab extends BorderPane { ...@@ -33,8 +32,7 @@ public class InspectionViewTab extends BorderPane {
new InspectionModel() new InspectionModel()
); );
public InspectionViewTab() { public InspectionView() {
super();
Utils.createWithFXML(this); Utils.createWithFXML(this);
model.get().selectedGoalNodeToShowProperty().bind( model.get().selectedGoalNodeToShowProperty().bind(
...@@ -85,21 +83,6 @@ public class InspectionViewTab extends BorderPane { ...@@ -85,21 +83,6 @@ public class InspectionViewTab extends BorderPane {
goalOptionsMenu.show(n, actionEvent.getScreenX(), actionEvent.getScreenY()); goalOptionsMenu.show(n, actionEvent.getScreenX(), actionEvent.getScreenY());
} }
public void refresh(RootModel model) {
/* IProgramMethod method = (IProgramMethod) model.getChosenContract().getTarget();
StringWriter writer = new StringWriter();
ProgramPrinter pp = new ProgramPrinter(writer);
try {
pp.printFullMethodSignature(method);
pp.printStatementBlock(method.getBody());
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
*/
}
/** /**
* Cells for GoalView * Cells for GoalView
*/ */
......
package edu.kit.formal.gui.controls; package edu.kit.formal.gui.controls;
import edu.kit.formal.gui.model.RootModel;
import javafx.beans.property.SimpleMapProperty; import javafx.beans.property.SimpleMapProperty;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.collections.ObservableMap; import javafx.collections.ObservableMap;
import org.dockfx.DockNode; import org.dockfx.DockNode;
/** /**
* TabPane on the right side of the GUI containing the inspection view as tabs * This controller manages a list of {@link InspectionView} and the associated {@link DockNode}s.
*
* Espeically, this class holds the active tab, which is connected with the {@link edu.kit.formal.interpreter.graphs.ProofTreeController},
* and shows the current interpreter state.
*
* @author weigl
*/ */
public class InspectionViewsController { public class InspectionViewsController {
...@@ -16,23 +20,31 @@ public class InspectionViewsController { ...@@ -16,23 +20,31 @@ public class InspectionViewsController {
* This tab can be changed and later on in this tab it should be possible to select proof commands * This tab can be changed and later on in this tab it should be possible to select proof commands
* All other tabs are only post morten tabs which cannot be shown * All other tabs are only post morten tabs which cannot be shown
*/ */
private final InspectionViewTab activeInterpreterTab = new InspectionViewTab(); private final InspectionView activeInterpreterTab = new InspectionView();
private final DockNode activeInterpreterTabDock = new DockNode(activeInterpreterTab, "Active"); private final DockNode activeInterpreterTabDock = new DockNode(activeInterpreterTab, "Active");
private final ObservableMap<InspectionView, DockNode> inspectionViews = new SimpleMapProperty<>(FXCollections.observableHashMap());
private final ObservableMap<InspectionViewTab, DockNode> inspectionViews = new SimpleMapProperty<>(FXCollections.observableHashMap()); public InspectionView getActiveInspectionViewTab() {
public InspectionViewTab getActiveInspectionViewTab() {
return this.activeInterpreterTab; return this.activeInterpreterTab;
} }
public DockNode getActiveInterpreterTabDock() { public DockNode getActiveInterpreterTabDock() {
return activeInterpreterTabDock; return activeInterpreterTabDock;
} }
public void connectActiveView(RootModel model) {
public DockNode newPostMortemInspector() {
InspectionView iv = new InspectionView();
DockNode dn = new DockNode(iv, "post mortem: ");
inspectionViews.put(iv, dn);
return dn;
}
/*public void connectActiveView(DebuggerModel model) {
getActiveInspectionViewTab().getGoalView().itemsProperty().bind(model.currentGoalNodesProperty()); getActiveInspectionViewTab().getGoalView().itemsProperty().bind(model.currentGoalNodesProperty());
model.currentSelectedGoalNodeProperty().addListener((p, old, fresh) -> { model.currentSelectedGoalNodeProperty().addListener((p, old, fresh) -> {
getActiveInspectionViewTab().getGoalView().getSelectionModel().select(fresh); getActiveInspectionViewTab().getGoalView().getSelectionModel().select(fresh);
}); });
} }*/
} }
...@@ -34,6 +34,8 @@ import lombok.RequiredArgsConstructor; ...@@ -34,6 +34,8 @@ import lombok.RequiredArgsConstructor;
import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.controlsfx.control.PopOver; import org.controlsfx.control.PopOver;
import org.fxmisc.richtext.CharacterHit; import org.fxmisc.richtext.CharacterHit;
import org.fxmisc.richtext.CodeArea; import org.fxmisc.richtext.CodeArea;
...@@ -49,19 +51,26 @@ import java.util.*; ...@@ -49,19 +51,26 @@ import java.util.*;
import java.util.function.IntFunction; import java.util.function.IntFunction;
/** /**
* ScriptArea is the textarea on the left side of the GUI. * ScriptArea is the {@link CodeArea} for writing Proof Scripts.
* <p>
* It displays the script code and allows highlighting of lines and setting of breakpoints * It displays the script code and allows highlighting of lines and setting of breakpoints
*/ */
public class ScriptArea extends CodeArea { public class ScriptArea extends CodeArea {
private final ObjectProperty<File> filePath = new SimpleObjectProperty<>(); private static final Logger LOGGER = LogManager.getLogger(ScriptArea.class);
/**
* Underlying filepath, should not be null
*/
private final ObjectProperty<File> filePath = new SimpleObjectProperty<>(new File(Utils.getRandomName()));
/**
* If true, the content was changed since last save.
*/
private final BooleanProperty dirty = new SimpleBooleanProperty(this, "dirty", false); private final BooleanProperty dirty = new SimpleBooleanProperty(this, "dirty", false);
/** /**
* Lines to highlight? * CSS classes for regions, used for "manually" highlightning. e.g. debugging marker
*/ */
private final SetProperty<RegionStyle> markedRegions = private final SetProperty<RegionStyle> markedRegions = new SimpleSetProperty<>(FXCollections.observableSet());
new SimpleSetProperty<>(FXCollections.observableSet());
/** /**
* set by {@link ScriptController} * set by {@link ScriptController}
*/ */
...@@ -71,7 +80,7 @@ public class ScriptArea extends CodeArea { ...@@ -71,7 +80,7 @@ public class ScriptArea extends CodeArea {
private ANTLR4LexerHighlighter highlighter; private ANTLR4LexerHighlighter highlighter;
private ListProperty<LintProblem> problems = new SimpleListProperty<>(FXCollections.observableArrayList()); private ListProperty<LintProblem> problems = new SimpleListProperty<>(FXCollections.observableArrayList());
private SimpleObjectProperty<CharacterHit> currentMouseOver = new SimpleObjectProperty<>(); private SimpleObjectProperty<CharacterHit> currentMouseOver = new SimpleObjectProperty<>();
private ScriptAreaContextMenu contextMenu; private ScriptAreaContextMenu contextMenu = new ScriptAreaContextMenu();
public ScriptArea() { public ScriptArea() {
...@@ -84,8 +93,11 @@ public class ScriptArea extends CodeArea { ...@@ -84,8 +93,11 @@ public class ScriptArea extends CodeArea {
highlighter = new ANTLR4LexerHighlighter( highlighter = new ANTLR4LexerHighlighter(
(String val) -> new ScriptLanguageLexer(CharStreams.fromString(val))); (String val) -> new ScriptLanguageLexer(CharStreams.fromString(val)));
this.setParagraphGraphicFactory(gutter); this.setParagraphGraphicFactory(gutter);
//getStylesheets().add(getClass().getResource("script-keywords.css").toExternalForm());
getStyleClass().add("script-area"); getStyleClass().add("script-area");
installPopup();
setOnMouseClicked(this::showContextMenu);
textProperty().addListener((prop, oldValue, newValue) -> { textProperty().addListener((prop, oldValue, newValue) -> {
dirty.set(true); dirty.set(true);
updateMainScriptMarker(); updateMainScriptMarker();
...@@ -105,8 +117,6 @@ public class ScriptArea extends CodeArea { ...@@ -105,8 +117,6 @@ public class ScriptArea extends CodeArea {
return Optional.empty(); return Optional.empty();
} }
}).subscribe(s -> setStyleSpans(0, s));*/ }).subscribe(s -> setStyleSpans(0, s));*/
getStyleClass().add("script-area");
installPopup();
this.addEventHandler(MouseEvent.MOUSE_PRESSED, (MouseEvent e) -> { this.addEventHandler(MouseEvent.MOUSE_PRESSED, (MouseEvent e) -> {
...@@ -118,10 +128,20 @@ public class ScriptArea extends CodeArea { ...@@ -118,10 +128,20 @@ public class ScriptArea extends CodeArea {
this.moveTo(characterPosition, NavigationActions.SelectionPolicy.CLEAR); this.moveTo(characterPosition, NavigationActions.SelectionPolicy.CLEAR);
}); });
mainScript.addListener((observable) -> mainScript.addListener((observable) -> updateMainScriptMarker());
updateMainScriptMarker()); }
public void showContextMenu(MouseEvent mouseEvent) {
if (contextMenu.isShowing())
contextMenu.hide();
if (mouseEvent.getButton() == MouseButton.SECONDARY) {
contextMenu.setAutoHide(true);
contextMenu.show(this, mouseEvent.getScreenX(), mouseEvent.getScreenY());
mouseEvent.consume();
} else {
contextMenu = new ScriptAreaContextMenu(); }
} }
private void updateHighlight() { private void updateHighlight() {
...@@ -517,7 +537,7 @@ public class ScriptArea extends CodeArea { ...@@ -517,7 +537,7 @@ public class ScriptArea extends CodeArea {
} }
public void setMainScript(ActionEvent event) { public void setMainScript(ActionEvent event) {
System.out.println("ScriptAreaContextMenu.setMainScript"); LOGGER.debug("ScriptAreaContextMenu.setMainScript");
List<ProofScript> ast = Facade.getAST(getText()); List<ProofScript> ast = Facade.getAST(getText());
int pos = currentMouseOver.get().getInsertionIndex(); int pos = currentMouseOver.get().getInsertionIndex();
ast.stream().filter(ps -> ast.stream().filter(ps ->
...@@ -531,6 +551,10 @@ public class ScriptArea extends CodeArea { ...@@ -531,6 +551,10 @@ public class ScriptArea extends CodeArea {
} }
public void showPostMortem(ActionEvent event) { public void showPostMortem(ActionEvent event) {
LOGGER.debug("ScriptAreaContextMenu.showPostMortem " + event);
//TODO forward to ProofTreeController, it jumps to the node and this should be done via the callbacks. //TODO forward to ProofTreeController, it jumps to the node and this should be done via the callbacks.
/*ScriptArea area = ScriptArea.this; /*ScriptArea area = ScriptArea.this;
......
...@@ -13,6 +13,8 @@ import javafx.beans.value.ChangeListener; ...@@ -13,6 +13,8 @@ import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue; import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.collections.ObservableMap; import javafx.collections.ObservableMap;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
...@@ -34,8 +36,8 @@ public class ScriptController { ...@@ -34,8 +36,8 @@ public class ScriptController {
public static final String LINE_HIGHLIGHT_POSTMORTEM = "line-highlight-postmortem"; public static final String LINE_HIGHLIGHT_POSTMORTEM = "line-highlight-postmortem";
private static Logger logger = LogManager.getLogger(ScriptController.class); private static Logger logger = LogManager.getLogger(ScriptController.class);
private final DockPane parent; private final DockPane parent;
private ObjectProperty<MainScriptIdentifier> mainScript = new SimpleObjectProperty<>();
private final ObservableMap<ScriptArea, DockNode> openScripts = FXCollections.observableMap(new HashMap<>()); private final ObservableMap<ScriptArea, DockNode> openScripts = FXCollections.observableMap(new HashMap<>());
private ObjectProperty<MainScriptIdentifier> mainScript = new SimpleObjectProperty<>();
private ScriptArea lastScriptArea; private ScriptArea lastScriptArea;
private ASTNodeHighlighter postMortemHighlighter = new ASTNodeHighlighter(LINE_HIGHLIGHT_POSTMORTEM); private ASTNodeHighlighter postMortemHighlighter = new ASTNodeHighlighter(LINE_HIGHLIGHT_POSTMORTEM);
...@@ -59,7 +61,7 @@ public class ScriptController { ...@@ -59,7 +61,7 @@ public class ScriptController {
return openScripts.get(editor); return openScripts.get(editor);
} }
public ScriptArea createNewTab(File filePath) { public ScriptArea createNewTab(File filePath) throws IOException {
filePath = filePath.getAbsoluteFile(); filePath = filePath.getAbsoluteFile();
if (findEditor(filePath) == null) { if (findEditor(filePath) == null) {
ScriptArea area = new ScriptArea(); ScriptArea area = new ScriptArea();
...@@ -67,6 +69,16 @@ public class ScriptController { ...@@ -67,6 +69,16 @@ public class ScriptController {
area.setFilePath(filePath); area.setFilePath(filePath);
DockNode dockNode = createDockNode(area); DockNode dockNode = createDockNode(area);
openScripts.put(area, dockNode); openScripts.put(area, dockNode);
if (filePath.exists()) {
String code = FileUtils.readFileToString(filePath, "utf-8");
if (!area.textProperty().getValue().isEmpty()) {
area.deleteText(0, area.textProperty().getValue().length());
}
area.setText(code);
}
return area; return area;
} else { } else {
logger.info("File already exists. Will not load it again"); logger.info("File already exists. Will not load it again");
...@@ -90,7 +102,7 @@ public class ScriptController { ...@@ -90,7 +102,7 @@ public class ScriptController {
area.dirtyProperty().addListener(new ChangeListener<Boolean>() { area.dirtyProperty().addListener(new ChangeListener<Boolean>() {
@Override @Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
if(newValue) if (newValue)
dockNode.setGraphic(new MaterialDesignIconView(MaterialDesignIcon.FILE_DOCUMENT)); dockNode.setGraphic(new MaterialDesignIconView(MaterialDesignIcon.FILE_DOCUMENT));
else else
dockNode.setGraphic(new MaterialDesignIconView(MaterialDesignIcon.FILE_DOCUMENT_BOX)); dockNode.setGraphic(new MaterialDesignIconView(MaterialDesignIcon.FILE_DOCUMENT_BOX));
...@@ -107,7 +119,6 @@ public class ScriptController { ...@@ -107,7 +119,6 @@ public class ScriptController {
return dockNode; return dockNode;
} }
public Set<Breakpoint> getBreakpoints() { public Set<Breakpoint> getBreakpoints() {
HashSet<Breakpoint> breakpoints = new HashSet<>(); HashSet<Breakpoint> breakpoints = new HashSet<>();
openScripts.keySet().forEach(tab -> openScripts.keySet().forEach(tab ->
...@@ -125,7 +136,6 @@ public class ScriptController { ...@@ -125,7 +136,6 @@ public class ScriptController {
.orElse(null); .orElse(null);
} }
public void saveCurrentScriptAs(File scriptFile) throws IOException { public void saveCurrentScriptAs(File scriptFile) throws IOException {
for (ScriptArea area : openScripts.keySet()) { for (ScriptArea area : openScripts.keySet()) {
if (area.isFocused()) { if (area.isFocused()) {
...@@ -139,101 +149,16 @@ public class ScriptController { ...@@ -139,101 +149,16 @@ public class ScriptController {
public List<ProofScript> getCombinedAST() { public List<ProofScript> getCombinedAST() {
ArrayList<ProofScript> all = new ArrayList<>(); ArrayList<ProofScript> all = new ArrayList<>();
for (ScriptArea area : openScripts.keySet()) { for (ScriptArea area : openScripts.keySet()) {
all.addAll(Facade.getAST(area.getText())); //absolute path important to find area later by token
CharStream stream = CharStreams.fromString(area.getText(), area.getFilePath().getAbsolutePath());
all.addAll(Facade.getAST(stream));
} }
return all; return all;
} }
private String[] ADJECTIVES =
("abandoned,able,absolute,adorable,adventurous,academic,acceptable,acclaimed,accomplished,accurate,aching,acidic,acrobatic,active,actual,adept,admirable,admired," +
"adolescent,adorable,adored,advanced,afraid,affectionate,aged,aggravating,aggressive,agile,agitated,agonizing,agreeable,ajar,alarmed,alarming,alert," +
"alienated,alive,all,altruistic,amazing,ambitious,ample,amused,amusing,anchored,ancient,angelic,angry,anguished,animated,annual,another,antique,anxious," +
"any,apprehensive,appropriate,apt,arctic,arid,aromatic,artistic,ashamed,assured,astonishing,athletic,attached,attentive,attractive,austere,authentic,authorized," +
"automatic,avaricious,average,aware,awesome,awful,awkward,babyish,bad,back,baggy,bare,barren,basic,beautiful,belated,beloved,beneficial,better,best,bewitched," +
"big,big-hearted,biodegradable,bite-sized,bitter,black,black-and-white,bland,blank,blaring,bleak,blind,blissful,blond,blue,blushing,bogus,boiling,bold,bony," +
"boring,bossy,both,bouncy,bountiful,bowed,brave,breakable,brief,bright,brilliant,brisk,broken,bronze,brown,bruised,bubbly,bulky,bumpy,buoyant,burdensome,burly," +
"bustling,busy,buttery,buzzing,calculating,calm,candid,canine,capital,carefree,careful,careless,caring,cautious,cavernous,celebrated,charming,cheap,cheerful," +
"cheery,chief,chilly,chubby,circular,classic,clean,clear,clear-cut,clever,close,closed,cloudy,clueless,clumsy,cluttered,coarse,cold,colorful,colorless," +
"colossal,comfortable,common,compassionate,competent,complete,complex,complicated,composed,concerned,concrete,confused,conscious,considerate,constant,content," +
"conventional,cooked,cool,cooperative,coordinated,corny,corrupt,costly,courageous,courteous,crafty,crazy,creamy,creative,creepy,criminal,crisp,critical," +
"crooked,crowded,cruel,crushing,cuddly,cultivated,cultured,cumbersome,curly,curvy,cute,cylindrical,damaged,damp,dangerous,dapper,daring,darling,dark,dazzling" +
",dead,deadly,deafening,dear,dearest,decent,decimal,decisive,deep,defenseless,defensive,defiant,deficient,definite,definitive,delayed,delectable,delicious," +
"delightful,delirious,demanding,dense,dental,dependable,dependent,descriptive,deserted,detailed,determined,devoted,different,difficult,digital,diligent,dim," +
"dimpled,dimwitted,direct,disastrous,discrete,disfigured,disgusting,disloyal,dismal,distant,downright,dreary,dirty,disguised,dishonest,dismal,distant,distinct," +
"distorted,dizzy,dopey,doting,double,downright,drab,drafty,dramatic,dreary,droopy,dry,dual,dull,dutiful,each,eager,earnest,early,easy,easy-going,ecstatic,edible" +