diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-01-15 22:35:29 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-01-15 22:35:29 +0100 |
| commit | ad548cf57ae5d729c4186ec8f710b0df2e6f24b4 (patch) | |
| tree | 515826b0d36eab32395abe09c1727011cdf151ed | |
| parent | b876a9ffb37882d1bc3b50b815a5b45af21735dc (diff) | |
64ld: Improved code and SDK.
IDE: Also did improve code.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
| -rw-r--r-- | 64x0-Drivers/64ld.cc | 171 | ||||
| -rw-r--r-- | CompilerKit/Defines.hpp | 2 | ||||
| -rw-r--r-- | CompilerKit/StdKit/AE.hpp | 44 | ||||
| -rw-r--r-- | CompilerKit/StdKit/PEF.hpp | 12 | ||||
| -rw-r--r-- | IDE/src/main/java/org/elmahrouss/App.java | 33 | ||||
| -rw-r--r-- | IDE/src/main/java/org/elmahrouss/CodeEditor.java | 74 | ||||
| -rw-r--r-- | IDE/src/main/java/org/elmahrouss/CodeEditorTheme.java | 4 | ||||
| -rw-r--r-- | IDE/src/main/java/org/elmahrouss/CodeEditorView.java | 92 | ||||
| -rw-r--r-- | IDE/src/main/java/org/elmahrouss/ConsoleWindow.java | 11 |
9 files changed, 267 insertions, 176 deletions
diff --git a/64x0-Drivers/64ld.cc b/64x0-Drivers/64ld.cc index ec16f6f..514843e 100644 --- a/64x0-Drivers/64ld.cc +++ b/64x0-Drivers/64ld.cc @@ -29,36 +29,39 @@ #include <uuid/uuid.h> //! @brief standard PEF entry. -#define kPefStart "__start" +#define kPefStart "__start" #define kToolVersion "64ld v2, (c) Mahrouss Logic" #define StringCompare(DST, SRC) strcmp(DST, SRC) -#define kPefNoCpu 0U -#define kPefNoSubCpu 0U +#define kPefNoCpu 0U +#define kPefNoSubCpu 0U -#define kWhite "\e[0;97m" -#define kStdOut (std::cout << kWhite) +#define kWhite "\e[0;97m" +#define kStdOut (std::cout << kWhite) -#define kPefDeaultOrg (uint64_t)0x10000 -#define kPefLinkerNumId 0x5046FF -#define kPefAbiId "Container:Abi:64x0" +#define kPefDeaultOrg (uint64_t)0x10000 +#define kPefLinkerNumId 0x5046FF +#define kPefAbiId "Container:Abi:64x0" -enum { kAbiMpUx = 0x5046 /* PF */ }; +enum +{ + kAbiMpUx = 0x5046 /* PF */ +}; static std::string kOutput = "a" kPefExt; static Int32 kAbi = kAbiMpUx; static Int32 kSubArch = kPefNoSubCpu; static Int32 kArch = CompilerKit::kPefArch64000; -static Bool kFatBinaryEnable = false; +static Bool kFatBinaryEnable = false; static Bool kStartFound = false; static Bool kDuplicateSymbols = false; static Bool kVerbose = false; /* ld is to be found, mld is to be found at runtime. */ -static const char* kLdDefineSymbol = ":64ld:"; -static const char* kLdDynamicSym = ":mld:"; +static const char *kLdDefineSymbol = ":64ld:"; +static const char *kLdDynamicSym = ":mld:"; /* object code and list. */ static std::vector<std::string> kObjectList; @@ -66,8 +69,8 @@ static std::vector<char> kObjectBytes; MPCC_MODULE(Linker64x0) { - bool is_executable = true; - + bool is_executable = true; + for (size_t i = 1; i < argc; ++i) { if (StringCompare(argv[i], "-h") == 0) @@ -77,13 +80,13 @@ MPCC_MODULE(Linker64x0) kStdOut << "-verbose: Print program backtrace (verbose mode).\n"; kStdOut << "-shared: Output as a shared library.\n"; kStdOut << "-fat-binary: Output as FAT PEF.\n"; - kStdOut << "-o: Select output filename.\n"; + kStdOut << "-o: Select output filename.\n"; // bye return 0; } else if (StringCompare(argv[i], "-v") == 0 || - StringCompare(argv[i], "--version") == 0) + StringCompare(argv[i], "--version") == 0) { kStdOut << kToolVersion << std::endl; // bye :D @@ -92,7 +95,7 @@ MPCC_MODULE(Linker64x0) else if (StringCompare(argv[i], "-fat-binary") == 0) { kFatBinaryEnable = true; - + continue; } else if (StringCompare(argv[i], "-verbose") == 0) @@ -113,7 +116,7 @@ MPCC_MODULE(Linker64x0) } else if (StringCompare(argv[i], "-o") == 0) { - kOutput = argv[i+1]; + kOutput = argv[i + 1]; ++i; continue; @@ -131,7 +134,7 @@ MPCC_MODULE(Linker64x0) continue; } } - + // sanity check. if (kObjectList.empty()) { @@ -141,7 +144,7 @@ MPCC_MODULE(Linker64x0) else { // check for exisiting files. - for (auto& obj : kObjectList) + for (auto &obj : kObjectList) { if (!std::filesystem::exists(obj)) { @@ -168,7 +171,7 @@ MPCC_MODULE(Linker64x0) pef_container.Kind = CompilerKit::kPefKindExec; pef_container.SubCpu = kSubArch; pef_container.Linker = kPefLinkerNumId; // Mahrouss Logic Linker - pef_container.Abi = kAbi; // Multi-Processor UX ABI + pef_container.Abi = kAbi; // Multi-Processor UX ABI pef_container.Magic[0] = kPefMagic[kFatBinaryEnable ? 2 : 0]; pef_container.Magic[1] = kPefMagic[1]; pef_container.Magic[2] = kPefMagic[kFatBinaryEnable ? 0 : 2]; @@ -193,48 +196,48 @@ MPCC_MODULE(Linker64x0) //! Read AE to convert as PEF. std::vector<CompilerKit::PEFCommandHeader> pef_command_hdrs; + CompilerKit::Utils::AEReadableProtocol readProto{}; - for (const auto& i : kObjectList) + for (const auto &i : kObjectList) { if (!std::filesystem::exists(i)) continue; CompilerKit::AEHeader hdr{}; - - std::ifstream input_object(i, std::ifstream::binary); - input_object.read((char*)&hdr, sizeof(CompilerKit::AEHeader)); - + readProto.USED_FP = std::ifstream(i, std::ifstream::binary); + readProto.USED_FP >> hdr; + auto ae_header = hdr; - - if (ae_header.fArch != kArch) - { - if (kVerbose) - kStdOut << "64ld: pef: is a fat binary? : "; - if (!kFatBinaryEnable) - { + if (ae_header.fMagic[0] == kAEMag0 && + ae_header.fMagic[1] == kAEMag1 && + ae_header.fSize == sizeof(CompilerKit::AEHeader)) + { + if (ae_header.fArch != kArch) + { if (kVerbose) - kStdOut << "no.\n"; + kStdOut << "64ld: pef: is a fat binary? : "; - kStdOut << "64ld: error: object " << i << " is a different kind of architecture and output isn't treated as FAT binary." << std::endl; + if (!kFatBinaryEnable) + { + if (kVerbose) + kStdOut << "no.\n"; - std::remove(kOutput.c_str()); - return -CXXKIT_FAT_ERROR; - } - else - { - if (kVerbose) + kStdOut << "64ld: error: object " << i << " is a different kind of architecture and output isn't treated as FAT binary." << std::endl; + + std::remove(kOutput.c_str()); + return -CXXKIT_FAT_ERROR; + } + else { - kStdOut << "yes.\n"; + if (kVerbose) + { + kStdOut << "yes.\n"; + } } } - } - if (ae_header.fMagic[0] == kAEMag0 && - ae_header.fMagic[1] == kAEMag1 && - ae_header.fSize == sizeof(CompilerKit::AEHeader)) - { // append arch type to archs varaible. archs |= ae_header.fArch; std::size_t cnt = ae_header.fCount; @@ -244,18 +247,16 @@ MPCC_MODULE(Linker64x0) pef_container.Count = cnt; - char* raw_ae_records = new char[cnt * sizeof(CompilerKit::AERecordHeader)]; + char_type *raw_ae_records = new char[cnt * sizeof(CompilerKit::AERecordHeader)]; memset(raw_ae_records, 0, cnt * sizeof(CompilerKit::AERecordHeader)); - input_object.read(raw_ae_records, std::streamsize(cnt * sizeof(CompilerKit::AERecordHeader))); - - auto* ae_records = (CompilerKit::AERecordHeader*)raw_ae_records; + auto *ae_records = readProto.Read(raw_ae_records, cnt); for (size_t ae_record_index = 0; ae_record_index < cnt; ++ae_record_index) { - CompilerKit::PEFCommandHeader command_header{ 0 }; + CompilerKit::PEFCommandHeader command_header{0}; - memcpy(command_header.Name, ae_records[ae_record_index].fName, kPefNameLen); + memcpy(command_header.Name, ae_records[ae_record_index].fName, kPefNameLen); // check this header if it's any valid. if (std::string(command_header.Name).find(".text") == std::string::npos && @@ -283,10 +284,10 @@ MPCC_MODULE(Linker64x0) pef_container.Start = ae_records[ae_record_index].fOffset; } -ld_mark_header: - command_header.Offset = ae_records[ae_record_index].fOffset; - command_header.Kind = ae_records[ae_record_index].fKind; - command_header.Size = ae_records[ae_record_index].fSize; + ld_mark_header: + command_header.Offset = ae_records[ae_record_index].fOffset; + command_header.Kind = ae_records[ae_record_index].fKind; + command_header.Size = ae_records[ae_record_index].fSize; if (kVerbose) kStdOut << "64ld: object record: " << ae_records[ae_record_index].fName << " was marked.\n"; @@ -299,15 +300,17 @@ ld_mark_header: std::vector<char> bytes; bytes.resize(ae_header.fCodeSize); - input_object.seekg(std::streamsize(ae_header.fStartCode)); - input_object.read(bytes.data(), std::streamsize(ae_header.fCodeSize)); + readProto.USED_FP.seekg(std::streamsize(ae_header.fStartCode)); + readProto.USED_FP.read(bytes.data(), std::streamsize(ae_header.fCodeSize)); - for (auto& byte : bytes) + for (auto &byte : bytes) { kObjectBytes.push_back(byte); } - continue; + readProto.USED_FP.close(); + + continue; } kStdOut << "64ld: not an object: " << i << std::endl; @@ -333,19 +336,19 @@ ld_mark_header: // step 2: check for errors (multiple symbols, undefined ones) - for (auto & pef_command_hdr : pef_command_hdrs) + for (auto &pef_command_hdr : pef_command_hdrs) { // check if this symbol needs to be resolved. if (std::string(pef_command_hdr.Name).find(kLdDefineSymbol) != - std::string::npos && + std::string::npos && std::string(pef_command_hdr.Name).find(kLdDynamicSym) == - std::string::npos) + std::string::npos) { if (kVerbose) kStdOut << "64ld: found undefined symbol: " << pef_command_hdr.Name << "\n"; if (auto it = std::find(not_found.begin(), not_found.end(), std::string(pef_command_hdr.Name)); - it == not_found.end()) + it == not_found.end()) { not_found.emplace_back(pef_command_hdr.Name); } @@ -359,7 +362,7 @@ ld_mark_header: for (size_t not_found_idx = 0; not_found_idx < pef_command_hdrs.size(); ++not_found_idx) { if (auto it = std::find(not_found.begin(), not_found.end(), std::string(pef_command_hdrs[not_found_idx].Name)); - it != not_found.end()) + it != not_found.end()) { std::string symbol_imp = *it; @@ -375,7 +378,7 @@ ld_mark_header: // the reason we do is because, this may not match the symbol, and we need // to look for other matching symbols. - for (auto& pef_command_hdr : pef_command_hdrs) + for (auto &pef_command_hdr : pef_command_hdrs) { if (std::string(pef_command_hdr.Name).find(symbol_imp) != std::string::npos && std::string(pef_command_hdr.Name).find(kLdDefineSymbol) == std::string::npos) @@ -387,7 +390,6 @@ ld_mark_header: { if (result_of_sym[i] != symbol_imp[i]) goto ld_continue_search; - } not_found.erase(it); @@ -399,7 +401,7 @@ ld_mark_header: } } -ld_continue_search: + ld_continue_search: continue; } } @@ -445,11 +447,11 @@ ld_continue_search: CompilerKit::PEFCommandHeader uuid_header{}; - uuid_t uuid{ 0 }; + uuid_t uuid{0}; uuid_generate_random(uuid); memcpy(uuid_header.Name, "UUID_TYPE:4:", strlen("UUID_TYPE:4:")); - memcpy(uuid_header.Name + strlen("UUID_TYPE:4:"), uuid, 16); + memcpy(uuid_header.Name + strlen("UUID_TYPE:4:"), uuid, 16); uuid_header.Size = 16; uuid_header.Offset = output_fc.tellp(); @@ -468,9 +470,9 @@ ld_continue_search: for (size_t cmd_hdr = 0UL; cmd_hdr < pef_command_hdrs.size(); ++cmd_hdr) { if (std::string(pef_command_hdrs[cmd_hdr].Name).find(kLdDefineSymbol) != - std::string::npos && + std::string::npos && std::string(pef_command_hdrs[cmd_hdr].Name).find(kLdDynamicSym) == - std::string::npos) + std::string::npos) { // ignore :64ld: headers, they do not contain code. continue; @@ -491,15 +493,20 @@ ld_continue_search: continue; if (std::string(pef_command_hdrs[cmd_hdr_sub].Name).find(kLdDefineSymbol) != - std::string::npos && + std::string::npos && std::string(pef_command_hdrs[cmd_hdr_sub].Name).find(kLdDynamicSym) == - std::string::npos) + std::string::npos) { + if (kVerbose) + { + kStdOut << "64ld: ignore :64ld: command header...\n"; + } + // ignore :64ld: headers, they do not contain code. continue; } - auto& pef_command_hdr = pef_command_hdrs[cmd_hdr_sub]; + auto &pef_command_hdr = pef_command_hdrs[cmd_hdr_sub]; if (pef_command_hdr.Name == std::string(pef_command_hdrs[cmd_hdr].Name)) { @@ -518,7 +525,7 @@ ld_continue_search: if (!duplicate_symbols.empty()) { - for (auto& symbol : duplicate_symbols) + for (auto &symbol : duplicate_symbols) { kStdOut << "64ld: multiple symbols of " << symbol << ".\n"; } @@ -526,7 +533,7 @@ ld_continue_search: std::remove(kOutput.c_str()); return -CXXKIT_EXEC_ERROR; } - + // step 2.5: write program bytes. for (auto byte : kObjectBytes) @@ -541,10 +548,10 @@ ld_continue_search: std::vector<std::string> unreferenced_symbols; - for (auto & pef_command_hdr : pef_command_hdrs) + for (auto &pef_command_hdr : pef_command_hdrs) { if (auto it = std::find(not_found.begin(), not_found.end(), std::string(pef_command_hdr.Name)); - it != not_found.end()) + it != not_found.end()) { unreferenced_symbols.emplace_back(pef_command_hdr.Name); } @@ -552,7 +559,7 @@ ld_continue_search: if (!unreferenced_symbols.empty()) { - for (auto& unreferenced_symbol : unreferenced_symbols) + for (auto &unreferenced_symbol : unreferenced_symbols) { kStdOut << "64ld: undefined symbol " << unreferenced_symbol << "\n"; } @@ -560,7 +567,7 @@ ld_continue_search: if (!kStartFound || kDuplicateSymbols && - std::filesystem::exists(kOutput) || + std::filesystem::exists(kOutput) || !unreferenced_symbols.empty()) { if (kVerbose) diff --git a/CompilerKit/Defines.hpp b/CompilerKit/Defines.hpp index 6118a9b..db52362 100644 --- a/CompilerKit/Defines.hpp +++ b/CompilerKit/Defines.hpp @@ -130,6 +130,8 @@ namespace CompilerKit } } +typedef char char_type; + #define kObjectFileExt ".o" #define kAsmFileExt64x0 ".64x" diff --git a/CompilerKit/StdKit/AE.hpp b/CompilerKit/StdKit/AE.hpp index f06c785..cc2144f 100644 --- a/CompilerKit/StdKit/AE.hpp +++ b/CompilerKit/StdKit/AE.hpp @@ -76,3 +76,47 @@ std::ofstream &operator<<(std::ofstream &fp, CompilerKit::AERecordHeader &contai return fp; } + +std::ifstream &operator>>(std::ifstream& fp, CompilerKit::AEHeader& container) +{ + fp.read((char*)&container, sizeof(CompilerKit::AEHeader)); + return fp; +} + +std::ifstream &operator>>(std::ifstream& fp, CompilerKit::AERecordHeader& container) +{ + fp.read((char*)&container, sizeof(CompilerKit::AERecordHeader)); + return fp; +} + +namespace CompilerKit::Utils +{ + class AEReadableProtocol final + { + public: + std::ifstream USED_FP; + + public: + explicit AEReadableProtocol() = default; + ~AEReadableProtocol() = default; + + CXXKIT_COPY_DEFAULT(AEReadableProtocol); + + AERecordHeaderPtr Read(char* raw, std::size_t sz) + { + if (!raw) + return nullptr; + + return this->_Read<AERecordHeader>(raw, sz * sizeof(AERecordHeader)); + } + + private: + template <typename TypeClass> + TypeClass* _Read(char* raw, std::size_t sz) + { + USED_FP.read(raw, std::streamsize(sz)); + return reinterpret_cast<TypeClass*>(raw); + } + + }; +}
\ No newline at end of file diff --git a/CompilerKit/StdKit/PEF.hpp b/CompilerKit/StdKit/PEF.hpp index b8c5190..a6c1ffe 100644 --- a/CompilerKit/StdKit/PEF.hpp +++ b/CompilerKit/StdKit/PEF.hpp @@ -98,3 +98,15 @@ inline std::ofstream& operator<<(std::ofstream& fp, CompilerKit::PEFCommandHeade fp.write((char*)&container, sizeof(CompilerKit::PEFCommandHeader)); return fp; } + +std::ifstream &operator>>(std::ifstream& fp, CompilerKit::PEFContainer& container) +{ + fp.read((char*)&container, sizeof(CompilerKit::PEFContainer)); + return fp; +} + +std::ifstream &operator>>(std::ifstream& fp, CompilerKit::PEFCommandHeader& container) +{ + fp.read((char*)&container, sizeof(CompilerKit::PEFCommandHeader)); + return fp; +} diff --git a/IDE/src/main/java/org/elmahrouss/App.java b/IDE/src/main/java/org/elmahrouss/App.java index 5fe6b32..d4e82d9 100644 --- a/IDE/src/main/java/org/elmahrouss/App.java +++ b/IDE/src/main/java/org/elmahrouss/App.java @@ -12,6 +12,7 @@ import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; +import javafx.event.EventTarget; import javafx.scene.Scene; import javafx.scene.input.KeyCombination; import javafx.scene.input.MouseEvent; @@ -24,10 +25,8 @@ import javafx.scene.control.TabPane; /** * JavaFX App */ -public class App extends Application { - - private static int COUNTER = 0; - +public class App extends Application +{ @Override public void start(Stage stage) { stage.setTitle("MetroWorks - Untitled"); @@ -36,33 +35,35 @@ public class App extends Application { var projectPane = new VBox(); projectPane.setSpacing(10); - TabPane tabePane = new TabPane(); + TabPane tabPages = new TabPane(); - Tab tabEditorWelcome = new Tab("Welcome!", new CodeEditor()); + Tab tabEditorWelcome = new Tab("Welcome!", new CodeEditorView(false)); - CodeEditor ed = ((CodeEditor) tabEditorWelcome.getContent()); + CodeEditorView editorView = ((CodeEditorView) tabEditorWelcome.getContent()); - Button buttonNewPane = new Button("New project..."); + Button buttonNewPane = new Button("Add source..."); buttonNewPane.onMouseClickedProperty().set((EventHandler<MouseEvent>) (MouseEvent c) -> { - ++COUNTER; - Tab tabCode = new Tab("Untitled (" + Integer.toString(COUNTER) + ")", new CodeEditor()); - tabePane.getTabs().add(tabCode); + CodeEditorView view = new CodeEditorView(true); + Tab tabCode = new Tab("Untitled", view); + + tabCode.setText("/tmp/metroworks/src/ (" + view.getFilename() + ")"); + tabPages.getTabs().add(tabCode); }); buttonNewPane.setTranslateX(70); buttonNewPane.setTranslateY(100); - ed.getChildren().addAll(buttonNewPane); + editorView.getChildren().addAll(buttonNewPane); - ed.setContents("Welcome to MetroWorks!\nThe embedded code editor."); - ed.getChildren().addAll(); + editorView.setContents("Welcome to MetroWorks!\nThe embedded code editor."); + editorView.getChildren().addAll(); tabEditorWelcome.setClosable(false); - tabePane.getTabs().add(tabEditorWelcome); + tabPages.getTabs().add(tabEditorWelcome); - projectPane.getChildren().addAll(tabePane); + projectPane.getChildren().addAll(tabPages); var scene = new Scene(projectPane, 1280, 720); diff --git a/IDE/src/main/java/org/elmahrouss/CodeEditor.java b/IDE/src/main/java/org/elmahrouss/CodeEditor.java deleted file mode 100644 index 3b00007..0000000 --- a/IDE/src/main/java/org/elmahrouss/CodeEditor.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * ======================================================== - * - * MPCC - * Copyright Mahrouss Logic, all rights reserved. - * - * ======================================================== - */ - - package org.elmahrouss; - -import javafx.beans.property.ObjectProperty; -import javafx.collections.ObservableList; -import javafx.event.EventHandler; -import javafx.scene.Node; -import javafx.scene.control.Label; -import javafx.scene.control.TextField; -import javafx.scene.input.KeyEvent; -import javafx.scene.layout.*; - -public class CodeEditor extends Pane { - private Pane linePane; - private Label lines; - private boolean readOnly; - - CodeEditor() - { - super(); - - readOnly = false; - lines = new Label(); - - lines.setStyle("-fx-font-size: 20"); - lines.setWrapText(true); - lines.setTranslateX(70); - lines.setTranslateY(30); - - linePane = new Pane(); - - linePane.setStyle("-fx-background-color: #" + CodeEditorTheme.lineTheme); - linePane.setMinSize(52, 720); - linePane.setMaxSize(52, 1080); - - this.getChildren().addAll(linePane, lines); - - this.setStyle("-fx-background-color: #" + CodeEditorTheme.backgroundTheme); - - this.setMinSize(1280, 720); - this.setMaxSize(1920, 1080); - - if (!readOnly) { - - } - } - - @Override - public ObservableList<Node> getChildren() { - return super.getChildren(); - } - - public boolean isReadOnly() { return readOnly; } - - public void setReadOnly(Boolean readOnly) { this.readOnly = readOnly; } - - public String getContents() { return lines.getText(); } - - public void setContents(String content) - { - if (readOnly) - return; - - lines.setText(content); - } -} diff --git a/IDE/src/main/java/org/elmahrouss/CodeEditorTheme.java b/IDE/src/main/java/org/elmahrouss/CodeEditorTheme.java index 532ba65..30dc5fb 100644 --- a/IDE/src/main/java/org/elmahrouss/CodeEditorTheme.java +++ b/IDE/src/main/java/org/elmahrouss/CodeEditorTheme.java @@ -10,7 +10,7 @@ package org.elmahrouss; public class CodeEditorTheme { - public static String backgroundTheme = "FFFFFF"; + public static String backgroundTheme = "202020"; public static String lineTheme = "1A1A1A"; - public static String lineClr = "white"; + public static String lineClr = "FFFFFF"; } diff --git a/IDE/src/main/java/org/elmahrouss/CodeEditorView.java b/IDE/src/main/java/org/elmahrouss/CodeEditorView.java new file mode 100644 index 0000000..e82fa59 --- /dev/null +++ b/IDE/src/main/java/org/elmahrouss/CodeEditorView.java @@ -0,0 +1,92 @@ +/* + * ======================================================== + * + * MPCC + * Copyright Mahrouss Logic, all rights reserved. + * + * ======================================================== + */ + + package org.elmahrouss; + +import java.io.Console; + +import javafx.collections.ObservableList; +import javafx.scene.Node; +import javafx.scene.control.Label; +import javafx.scene.layout.*; +import javafx.scene.paint.Color; + +/* + * Editor view class + */ +public class CodeEditorView extends Pane { + private Pane linePane; + private Label codeText; + private boolean readOnly; + private ConsoleWindow consoleWindow; + private HBox codeBox; + private String filename = "untitled.c"; + + CodeEditorView(boolean readOnly) + { + super(); + + this.readOnly = readOnly; + + codeText = new Label(); + + codeText.setStyle("-fx-font-size: 20"); + codeText.setTextFill(Color.color(1, 1, 1)); + + codeText.setWrapText(true); + codeText.setTranslateX(70); + codeText.setTranslateY(30); + + linePane = new Pane(); + + linePane.setStyle("-fx-background-color: #" + CodeEditorTheme.lineTheme); + linePane.setMinSize(52, 720); + linePane.setMaxSize(52, 1080); + + this.setStyle("-fx-background-color: #" + CodeEditorTheme.backgroundTheme); + + this.setMinSize(1280, 720); + this.setMaxSize(1920, 1080); + + codeBox = new HBox(); + + if (!this.readOnly) { + consoleWindow = new ConsoleWindow(); + + codeBox.getChildren().add(consoleWindow); + codeBox.getChildren().add(codeText); + } + + this.getChildren().addAll(linePane, codeBox); + } + + public boolean isReadOnly() { return readOnly; } + + public void setReadOnly(Boolean readOnly) { this.readOnly = readOnly; } + + public String getFilename() { return filename; } + + public void setFilename(String filename) + { + if (readOnly) + return; + + this.filename = filename; + } + + public String getContents() { return codeText.getText(); } + + public void setContents(String content) + { + if (readOnly) + return; + + this.codeText.setText(content); + } +} diff --git a/IDE/src/main/java/org/elmahrouss/ConsoleWindow.java b/IDE/src/main/java/org/elmahrouss/ConsoleWindow.java index c6e521c..ed378c9 100644 --- a/IDE/src/main/java/org/elmahrouss/ConsoleWindow.java +++ b/IDE/src/main/java/org/elmahrouss/ConsoleWindow.java @@ -9,6 +9,13 @@ package org.elmahrouss; -public class ConsoleWindow { - + import javafx.collections.ObservableList; + import javafx.scene.Node; + import javafx.scene.control.Label; + import javafx.scene.layout.*; + +public class ConsoleWindow extends Pane { + ConsoleWindow() { + super(); + } } |
