summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-01-15 22:35:29 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-01-15 22:35:29 +0100
commitad548cf57ae5d729c4186ec8f710b0df2e6f24b4 (patch)
tree515826b0d36eab32395abe09c1727011cdf151ed
parentb876a9ffb37882d1bc3b50b815a5b45af21735dc (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.cc171
-rw-r--r--CompilerKit/Defines.hpp2
-rw-r--r--CompilerKit/StdKit/AE.hpp44
-rw-r--r--CompilerKit/StdKit/PEF.hpp12
-rw-r--r--IDE/src/main/java/org/elmahrouss/App.java33
-rw-r--r--IDE/src/main/java/org/elmahrouss/CodeEditor.java74
-rw-r--r--IDE/src/main/java/org/elmahrouss/CodeEditorTheme.java4
-rw-r--r--IDE/src/main/java/org/elmahrouss/CodeEditorView.java92
-rw-r--r--IDE/src/main/java/org/elmahrouss/ConsoleWindow.java11
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();
+ }
}