diff --git a/src/server/ContentService.hs b/src/server/ContentService.hs index ef92e8cf9..c0d0a713f 100644 --- a/src/server/ContentService.hs +++ b/src/server/ContentService.hs @@ -50,15 +50,21 @@ cgiMain' cache path = do c <- liftIO $ readCache cache path mb_command <- liftM (liftM (urlDecodeUnicode . UTF8.decodeString)) (getInput "command") case mb_command of + Just "update_grammar" + -> do mb_pgf <- getFile + id <- getGrammarId + name <- getFileName + descr <- getDescription + doUpdateGrammar c mb_pgf id name descr + Just "delete_grammar" + -> do id <- getGrammarId + doDeleteGrammar c id + Just "grammars" + -> doGrammars c Just "save" -> doSave c =<< getId Just "load" -> doLoad c =<< getId Just "search" -> doSearch c =<< getQuery Just "delete" -> doDelete c =<< getIds - Just "update_grammar" - -> do mb_pgf <- getFile - name <- getFileName - descr <- getDescription - doUpdateGrammar c mb_pgf name descr Just cmd -> throwCGIError 400 "Unknown command" ["Unknown command: " ++ show cmd] Nothing -> throwCGIError 400 "No command given" ["No command given"] where @@ -70,19 +76,71 @@ cgiMain' cache path = getQuery :: CGI String getQuery = fmap (fromMaybe "") (getInput "query") - + + getGrammarId :: CGI String + getGrammarId = do + mb_url <- getInput "url" + return (maybe "null" (reverse . drop 4 . reverse) mb_url) + getFile :: CGI (Maybe BS.ByteString) - getFile = getInputFPS "file" + getFile = do + getInputFPS "file" getFileName :: CGI String getFileName = do - mb_name <- getInput "name" + mb_name0 <- getInput "name" + let mb_name | mb_name0 == Just "" = Nothing + | otherwise = mb_name0 mb_file <- getInputFilename "file" return (fromMaybe "" (mb_name `mplus` mb_file)) getDescription :: CGI String getDescription = fmap (fromMaybe "") (getInput "description") +doGrammars c = do + r <- liftIO $ handleSql (return . Left) $ do + s <- query c "call getGrammars()" + rows <- collectRows getGrammar s + return (Right rows) + case r of + Right rows -> outputJSONP rows + Left e -> throwCGIError 400 "Loading failed" (lines (show e)) + where + getGrammar s = do + id <- getFieldValue s "id" + name <- getFieldValue s "name" + description <- getFieldValue s "description" + return $ toJSObject [ ("url", showJSON (addExtension (show (id :: Int)) "pgf")) + , ("name", showJSON (name :: String)) + , ("description", showJSON (description :: String)) + ] + +doUpdateGrammar c mb_pgf id name descr = do + r <- liftIO $ handleSql (return . Left) $ do + s <- query c ("call updateGrammar("++id++","++toSqlValue name++","++toSqlValue descr++")") + [id] <- collectRows (\s -> getFieldValue s "id") s + return (Right id) + nid <- case r of + Right id -> return (id :: Int) + Left e -> throwCGIError 400 "Saving failed" (lines (show e)) + path <- pathTranslated + case mb_pgf of + Just pgf -> if pgf /= BS.empty + then liftIO (BS.writeFile (dropExtension path addExtension (show nid) "pgf") pgf) + else if id == "null" + then throwCGIError 400 "Grammar update failed" [] + else return () + Nothing -> return () + outputHTML "" + +doDeleteGrammar c id = do + r <- liftIO $ handleSql (return . Left) $ do + execute c ("call deleteGrammar("++id++")") + return (Right "") + case r of + Right x -> outputJSONP ([] :: [(String,String)]) + Left e -> throwCGIError 400 "Saving failed" (lines (show e)) + doSave c mb_id = do body <- getBody r <- liftIO $ handleSql (return . Left) $ do @@ -151,20 +209,6 @@ doDelete c ids = do mapM_ (\id -> execute c ("DELETE FROM Documents WHERE id = "++toSqlValue id)) ids outputJSONP (toJSObject ([] :: [(String,String)])) -doUpdateGrammar c mb_pgf name descr = do - r <- liftIO $ handleSql (return . Left) $ do - s <- query c ("call updateGrammar(null,"++toSqlValue name++","++toSqlValue descr++")") - [id] <- collectRows (\s -> getFieldValue s "id") s - return (Right id) - id <- case r of - Right id -> return (id :: Int) - Left e -> throwCGIError 400 "Saving failed" (lines (show e)) - path <- pathTranslated - case mb_pgf of - Just pgf -> liftIO (BS.writeFile (path ".." "grammars" addExtension (show id) "pgf") pgf) - Nothing -> return () - outputHTML "

Done.

" - dbConnect fpath = do [host,db,user,pwd] <- fmap words $ readFile fpath connect host db user pwd @@ -207,3 +251,13 @@ dbInit c = " select id;\n"++ " END IF;\n"++ "END") + execute c "DROP PROCEDURE IF EXISTS deleteGrammar" + execute c ("CREATE PROCEDURE deleteGrammar(IN grammarId INTEGER)\n"++ + "BEGIN\n"++ + " DELETE FROM Grammars WHERE id = grammarId;\n"++ + "END") + execute c "DROP PROCEDURE IF EXISTS getGrammars" + execute c ("CREATE PROCEDURE getGrammars()\n"++ + "BEGIN\n"++ + " SELECT id,name,description FROM Grammars ORDER BY name;\n"++ + "END") diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/BrowsePanel.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/BrowsePanel.java index a512b0b03..ed5af3faf 100644 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/BrowsePanel.java +++ b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/BrowsePanel.java @@ -234,7 +234,7 @@ public class BrowsePanel extends Composite { } } - protected class MySettingsListener implements PGFWrapper.SettingsListener { + protected class MySettingsListener implements SettingsListener { private PGFWrapper pgf; diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/CompletionOracle.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/CompletionOracle.java index 504c13879..7ea5d2be6 100644 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/CompletionOracle.java +++ b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/CompletionOracle.java @@ -28,7 +28,7 @@ public class CompletionOracle extends SuggestOracle { public CompletionOracle (PGFWrapper pgf, ErrorHandler errorHandler) { this.pgf = pgf; this.errorHandler = errorHandler; - pgf.addSettingsListener(new PGFWrapper.SettingsListener() { + pgf.addSettingsListener(new SettingsListener() { public void onAvailableGrammarsChanged() { clearState(); } public void onSelectedGrammarChanged() { clearState(); } public void onInputLanguageChanged() { clearState(); } diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/ContentService.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/ContentService.java index 42ae897ba..e6f0b5509 100644 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/ContentService.java +++ b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/ContentService.java @@ -8,6 +8,11 @@ import com.google.gwt.core.client.*; public class ContentService { String contentBaseURL; + // Event listeners + private List listeners = new LinkedList(); + private List grammars = null; + + public ContentService(String contentBaseURL) { this.contentBaseURL = contentBaseURL; } @@ -15,6 +20,51 @@ public class ContentService { public String getBaseURL() { return contentBaseURL; } + + public void addSettingsListener(SettingsListener listener) { + listeners.add(listener); + } + + public void updateAvailableGrammars() { + List args = new ArrayList(); + args.add(new Arg("command", "grammars")); + JSONRequestBuilder.sendRequest(contentBaseURL, args, new GrammarsCallback() { + public void onResult(IterableJsArray grammars_) { + grammars = new ArrayList(); + for (ContentService.GrammarInfo grammar : grammars_.iterable()) { + grammars.add(grammar); + } + + for (SettingsListener listener : listeners) { + listener.onAvailableGrammarsChanged(); + } + } + + public void onError(Throwable e) { + } + }); + } + + public List getGrammars() { + return grammars; + } + + public interface GrammarsCallback extends JSONCallback> {} + + public static class GrammarInfo extends JavaScriptObject { + protected GrammarInfo() { } + + public final native String getURL() /*-{ return this.url; }-*/; + public final native String getName() /*-{ return this.name; }-*/; + public final native String getDescription() /*-{ return this.description; }-*/; + } + + public JSONRequest deleteGrammar(String grammarURL, DeleteCallback callback) { + List args = new ArrayList(); + args.add(new Arg("url", grammarURL)); + args.add(new Arg("command", "delete_grammar")); + return JSONRequestBuilder.sendRequest(contentBaseURL, args, callback); + } public JSONRequest save(Object id, String content, SaveCallback callback) { List args = new ArrayList(); diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/DocumentsPanel.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/DocumentsPanel.java index c2f5b3844..09acce5f5 100644 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/DocumentsPanel.java +++ b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/DocumentsPanel.java @@ -44,7 +44,7 @@ public class DocumentsPanel extends Composite implements HasSelectionHandlers")); - - FileUpload fileUpload = new FileUpload(); - fileUpload.setName("file"); - vPanel.add(fileUpload); - - vPanel.add(new HTML("
")); - - vPanel.add(new Label("Name:")); - TextBox grammarName = new TextBox(); - grammarName.setName("name"); - grammarName.setWidth("100%"); - vPanel.add(grammarName); - - vPanel.add(new HTML("
")); - - vPanel.add(new Label("Description:")); - TextArea grammarDescr = new TextArea(); - grammarDescr.setName("description"); - grammarDescr.setWidth("100%"); - grammarDescr.setHeight("150px"); - vPanel.add(grammarDescr); - - VerticalPanel btnPanel = new VerticalPanel(); - btnPanel.setSpacing(3); - hPanel.add(btnPanel); - - btnPanel.add(new Button("Upload", new ClickListener() { + Button btnNew = new Button("New Grammar"); + btnNew.addClickListener(new ClickListener() { public void onClick(Widget sender) { - form.submit(); + if (form == null) { + grammarsPanel.insert(new GrammarInfoPanel(null),0); + } } - })); - btnPanel.add(new Button("Cancel", new ClickListener() { - public void onClick(Widget sender) { - } - })); + }); + vpanel.add(btnNew); - initWidget(grammarsPanel); + grammarsPanel = new VerticalPanel(); + grammarsPanel.setWidth("100%"); + vpanel.add(grammarsPanel); + + initWidget(vpanel); setStylePrimaryName("my-GrammarsPanel"); + + contentService.addSettingsListener(new MySettingsListener()); } - private class UploadFormHandler implements FormPanel.SubmitHandler, FormPanel.SubmitCompleteHandler { - public void onSubmit(FormPanel.SubmitEvent event) { + private class GrammarInfoPanel extends Composite { + public GrammarInfoPanel(final ContentService.GrammarInfo grammar) { + final VerticalPanel vpanel = new VerticalPanel(); + + if (grammar != null) { + FlexTable header = new FlexTable(); + header.setStylePrimaryName("my-TableHeader"); + header.setText(0,0,grammar.getName()); + vpanel.add(header); + + final Image updateButton = new Image("org.grammaticalframework.ui.gwt.EditorApp/grammar-buttons.png",0,0,20,20); + updateButton.setTitle("Edit the grammar definition."); + updateButton.setStylePrimaryName("toolbar-button"); + header.setWidget(0,1,updateButton); + header.getColumnFormatter().setWidth(1,"20px"); + + final Image deleteButton = new Image("org.grammaticalframework.ui.gwt.EditorApp/grammar-buttons.png",20,0,20,20); + deleteButton.setTitle("Delete this grammar."); + deleteButton.setStylePrimaryName("toolbar-button"); + header.setWidget(0,2,deleteButton); + header.getColumnFormatter().setWidth(2,"20px"); + + final Label descr = new Label(grammar.getDescription()); + descr.setStylePrimaryName("descr-label"); + vpanel.add(descr); + + updateButton.addClickListener(new ClickListener () { + public void onClick(Widget sender) { + if (form == null) { + vpanel.remove(descr); + vpanel.add(form = createUploadForm(grammar)); + } + } + }); + + deleteButton.addClickListener(new ClickListener () { + public void onClick(Widget sender) { + contentService.deleteGrammar(grammar.getURL(), new ContentService.DeleteCallback() { + public void onResult(ContentService.DeleteResult result) { + contentService.updateAvailableGrammars(); + } + + public void onError(Throwable e) { + statusPopup.showError("Delete failed", e); + } + }); + } + }); + } else { + FlexTable header = new FlexTable(); + header.setStylePrimaryName("my-TableHeader"); + header.setText(0,0,"Add New Grammar"); + vpanel.add(header); + vpanel.add(form = createUploadForm(grammar)); + } + + initWidget(vpanel); + setStylePrimaryName("my-GrammarInfoPanel"); } + + public FormPanel createUploadForm(final ContentService.GrammarInfo grammar) { + UploadFormHandler uploadFormHandler = new UploadFormHandler(); + + final FormPanel form = new FormPanel(); + form.setWidth("100%"); + form.setEncoding(FormPanel.ENCODING_MULTIPART); + form.setMethod(FormPanel.METHOD_POST); + form.setAction(contentService.getBaseURL()); + form.addSubmitHandler(uploadFormHandler); + form.addSubmitCompleteHandler(uploadFormHandler); + + VerticalPanel vPanel = new VerticalPanel(); + vPanel.setWidth("100%"); + form.add(vPanel); + + vPanel.add(new HTML("")); - public void onSubmitComplete(FormPanel.SubmitCompleteEvent event) { + HorizontalPanel hPanel = new HorizontalPanel(); + hPanel.setSpacing(8); + hPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE); + vPanel.add(hPanel); + + final FileUpload fileUpload = new FileUpload(); + fileUpload.setName("file"); + hPanel.add(fileUpload); + + hPanel.add(new HTML(" ")); + + hPanel.add(new Label("Name:")); + final TextBox grammarName = new TextBox(); + grammarName.setName("name"); + grammarName.setWidth("300px"); + hPanel.add(grammarName); + + hPanel.add(new HTML(" ")); + + hPanel.add(new Button("Upload", new ClickListener() { + public void onClick(Widget sender) { + if (grammar == null && + fileUpload.getFilename().equals("")) + statusPopup.showError("You must select a file to upload", null); + else + form.submit(); + } + })); + hPanel.add(new Button("Cancel", new ClickListener() { + public void onClick(Widget sender) { + contentService.updateAvailableGrammars(); + } + })); + + vPanel.add(new Label("Description:")); + TextArea grammarDescr = new TextArea(); + grammarDescr.setName("description"); + grammarDescr.setWidth("100%"); + grammarDescr.setHeight("50px"); + vPanel.add(grammarDescr); + + if (grammar != null) { + grammarName.setText(grammar.getName()); + grammarDescr.setText(grammar.getDescription()); + + vPanel.add(new HTML("")); + } + + return form; } - }; + + private class UploadFormHandler implements FormPanel.SubmitHandler, FormPanel.SubmitCompleteHandler { + public void onSubmit(FormPanel.SubmitEvent event) { + } + + public void onSubmitComplete(FormPanel.SubmitCompleteEvent event) { + contentService.updateAvailableGrammars(); + } + } + } + + private class MySettingsListener implements SettingsListener { + public void onAvailableGrammarsChanged() { + form = null; + grammarsPanel.clear(); + for (ContentService.GrammarInfo grammar : contentService.getGrammars()) { + grammarsPanel.add(new GrammarInfoPanel(grammar)); + } + } + public void onSelectedGrammarChanged() { } + public void onInputLanguageChanged() { } + public void onOutputLanguageChanged() { } + public void onStartCategoryChanged() { } + public void onSettingsError(String msg, Throwable e) { } + } } diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/PGFWrapper.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/PGFWrapper.java index 2c85a4704..9c88da7f6 100644 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/PGFWrapper.java +++ b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/PGFWrapper.java @@ -100,6 +100,9 @@ public class PGFWrapper { } protected void updateSelectedGrammar () { + if (grammarURL == null) + return; + clearCachedInfo(); pgf.grammar(grammarURL, new PGF.GrammarCallback() { public void onResult(PGF.Grammar grammar) { @@ -176,7 +179,7 @@ public class PGFWrapper { public void setPGFName(String pgfName) { this.pgfName = pgfName; - this.grammarURL = baseURL + "/" + pgfName; + this.grammarURL = (pgfName == null) ? null : baseURL + "/" + pgfName; this.inputLanguage = null; this.outputLanguage = null; this.cat = null; @@ -263,15 +266,6 @@ public class PGFWrapper { // Listeners // - public interface SettingsListener { - public void onAvailableGrammarsChanged(); - public void onSelectedGrammarChanged(); - public void onInputLanguageChanged(); - public void onOutputLanguageChanged(); - public void onStartCategoryChanged(); - public void onSettingsError(String msg, Throwable e); - } - public static class SettingsAdapter implements SettingsListener { public void onAvailableGrammarsChanged() {} public void onSelectedGrammarChanged() {} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/QueryPanel.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/QueryPanel.java index 25a278650..b364ed0b6 100644 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/QueryPanel.java +++ b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/QueryPanel.java @@ -124,7 +124,7 @@ public class QueryPanel extends Composite { return queryPanel; } - protected class MySettingsListener implements PGFWrapper.SettingsListener { + protected class MySettingsListener implements SettingsListener { public MySettingsListener() { } diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SettingsListener.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SettingsListener.java new file mode 100644 index 000000000..494c990f6 --- /dev/null +++ b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SettingsListener.java @@ -0,0 +1,10 @@ +package org.grammaticalframework.ui.gwt.client; + +public interface SettingsListener { + public void onAvailableGrammarsChanged(); + public void onSelectedGrammarChanged(); + public void onInputLanguageChanged(); + public void onOutputLanguageChanged(); + public void onStartCategoryChanged(); + public void onSettingsError(String msg, Throwable e); +} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SettingsPanel.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SettingsPanel.java index 1ee3f71e1..a5c19bc64 100644 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SettingsPanel.java +++ b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SettingsPanel.java @@ -5,31 +5,29 @@ import com.google.gwt.user.client.ui.*; public class SettingsPanel extends Composite { private PGFWrapper pgf; + private ContentService contentService; + private StatusPopup statusPopup; private MyListBox grammarBox; private MyListBox fromLangBox; private MyListBox toLangBox; - public SettingsPanel (PGFWrapper pgf) { - this(pgf, true, true); - } - - public SettingsPanel (PGFWrapper pgf, boolean showPGFName, boolean showOutputLanguage) { + public SettingsPanel (PGFWrapper pgf, ContentService contentService, StatusPopup statusPopup) { this.pgf = pgf; - + this.contentService = contentService; + this.statusPopup = statusPopup; + HorizontalPanel settingsPanel = new HorizontalPanel(); settingsPanel.setHorizontalAlignment(HorizontalPanel.ALIGN_CENTER); settingsPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE); - if (showPGFName) { - grammarBox = new MyListBox(); - grammarBox.addChangeListener(new ChangeListener() { - public void onChange(Widget sender) { - SettingsPanel.this.pgf.setPGFName(grammarBox.getSelectedValue()); - } - }); - settingsPanel.add(new FormWidget("Grammar:", grammarBox)); - } + grammarBox = new MyListBox(); + grammarBox.addChangeListener(new ChangeListener() { + public void onChange(Widget sender) { + SettingsPanel.this.pgf.setPGFName(grammarBox.getSelectedValue()); + } + }); + settingsPanel.add(new FormWidget("Grammar:", grammarBox)); fromLangBox = new MyListBox(); fromLangBox.addChangeListener(new ChangeListener() { @@ -39,20 +37,19 @@ public class SettingsPanel extends Composite { }); settingsPanel.add(new FormWidget("From:", fromLangBox)); - if (showOutputLanguage) { - toLangBox = new MyListBox(); - toLangBox.addChangeListener(new ChangeListener() { - public void onChange(Widget sender) { - SettingsPanel.this.pgf.setOutputLanguage(toLangBox.getSelectedValue()); - } - }); - settingsPanel.add(new FormWidget("To:", toLangBox)); - } + toLangBox = new MyListBox(); + toLangBox.addChangeListener(new ChangeListener() { + public void onChange(Widget sender) { + SettingsPanel.this.pgf.setOutputLanguage(toLangBox.getSelectedValue()); + } + }); + settingsPanel.add(new FormWidget("To:", toLangBox)); initWidget(settingsPanel); setStylePrimaryName("my-SettingsPanel"); pgf.addSettingsListener(new MySettingsListener()); + contentService.addSettingsListener(new MySettingsListener()); } private static class FormWidget extends HorizontalPanel { @@ -64,11 +61,15 @@ public class SettingsPanel extends Composite { } } - private class MySettingsListener implements PGFWrapper.SettingsListener { + private class MySettingsListener implements SettingsListener { public void onAvailableGrammarsChanged() { if (grammarBox != null) { grammarBox.clear(); - grammarBox.addItems(pgf.getGrammars()); + + for (ContentService.GrammarInfo grammar : contentService.getGrammars()) { + grammarBox.addItem(grammar.getName(), grammar.getURL()); + } + pgf.setPGFName(grammarBox.getSelectedValue()); } } public void onSelectedGrammarChanged() { diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/TranslateApp.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/TranslateApp.java index ae7e73f4a..9a6b84a8a 100644 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/TranslateApp.java +++ b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/TranslateApp.java @@ -203,7 +203,7 @@ public class TranslateApp implements EntryPoint { vPanel.setWidth("100%"); vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER); vPanel.add(createSuggestPanel()); - vPanel.add(createSettingsPanel()); + vPanel.add(createSettingsPanel()); vPanel.add(createTranslationsPanel()); return vPanel; @@ -221,7 +221,7 @@ public class TranslateApp implements EntryPoint { } protected Widget createSettingsPanel () { - return new SettingsPanel(pgf); + return new SettingsPanel(pgf, null, statusPopup); } protected Widget createTranslationsPanel () { @@ -276,7 +276,7 @@ public class TranslateApp implements EntryPoint { // Initialization // - protected class MySettingsListener implements PGFWrapper.SettingsListener { + protected class MySettingsListener implements SettingsListener { // Will only happen on load public void onAvailableGrammarsChanged() { if (pgf.getPGFName() == null) { diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/Editor.css b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/Editor.css index 45abd36b2..0fd99f8a3 100644 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/Editor.css +++ b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/Editor.css @@ -15,16 +15,6 @@ margin: 0 0.4em; } -.my-DocumentsHeader { - width: 100%; - background-attachement: scroll; - background-color: #E5E5E5; - background-image: url("background.png"); - background-position: 0px -192px; - background-repeat: repeat-x; - font-size: 150%; -} - .my-DocumentsTable { width: 100%; border: 1px solid #E5E5E5; @@ -45,6 +35,29 @@ width: 100%; } +.my-GrammarInfoPanel { + width: 100%; + border: 1px solid #E5E5E5; + margin-top: 5px; + margin-bottom: 5px; +} + +.my-GrammarInfoPanel .descr-label { + width: 100%; + height: 50px; + padding: 3px; +} + +.my-TableHeader { + width: 100%; + background-attachement: scroll; + background-color: #E5E5E5; + background-image: url("background.png"); + background-position: 0px -192px; + background-repeat: repeat-x; + font-size: 150%; +} + .my-EditorPanel { padding-top: 1em; padding-bottom: 1em diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/grammar-buttons.png b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/grammar-buttons.png new file mode 100644 index 000000000..6cb89ca4b Binary files /dev/null and b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/grammar-buttons.png differ