Compare commits

...

51 Commits

Author SHA1 Message Date
Vadim Lopatin ec29ced5b6
improve HDPI support 2024-03-08 11:46:42 +00:00
Grim Maple 1bd86c66cd Update code for dlangui 0.10.3 2023-05-18 22:57:40 +03:00
Grim Maple b822795449 Bump dcd version 2023-04-18 17:13:48 +03:00
Grim Maple aeb045e66e Fix logger 2023-04-18 16:58:51 +03:00
Grim Maple e18eaa2b5b
Merge pull request #428 from abstewart/master
Update dlangui dependency to version 0.10.2
2023-04-04 11:48:17 +03:00
abstewart ccac2ad2b9 update dlangui dependency to version 0.10.2 2023-04-03 16:31:32 -04:00
Grim Maple 72ea89b6ec Bump DCD version for tha sweet UFCS support.
Also, removed DCD submodule bacuse it's a dub dependency anyway. Closes #397
2022-10-22 14:42:16 +03:00
Grim Maple 8c072de2af Fix autocompletion crash; autocompletion cancel 2022-04-26 19:29:15 +03:00
Grim Maple 0dee6cb1f1 Add autocompletion on each key press 2022-04-22 23:35:54 +03:00
Grim Maple daeb6f58af Update dlangui dep 2022-04-16 16:18:34 +03:00
Grim Maple 61cda23311 Fix deprecations 2022-04-14 23:57:20 +03:00
Grim Maple 51728e70eb Update DCD 2022-04-06 22:27:22 +03:00
Grim Maple b511e32ca3 Fix autocomplete 2022-04-06 22:18:34 +03:00
Vadim Lopatin c566de2633
Merge pull request #406 from leh103/master
Fix for isuue #398
2019-08-09 11:51:23 +03:00
Lawrence Hemsley eac96a7d05 Fix for isuue #398 2019-03-09 15:12:27 -07:00
Vadim Lopatin 16abdd171b fix SDL build 2018-11-26 12:12:46 +03:00
Vadim Lopatin 4e64798b9b update version 2018-11-26 09:55:19 +03:00
Vadim Lopatin b5333788ae upgrade dlangui version 2018-11-26 09:54:40 +03:00
Vadim Lopatin 64cfd574b1 update version 2018-11-26 08:42:20 +03:00
Vadim Lopatin 98c8d835ea
Merge pull request #388 from sr-tream/master
Fix color codes. Now it compilable
2018-11-26 08:34:21 +03:00
SR_team 5b57d9eafe Fix color codes. Now it compilable 2018-10-31 16:06:21 +03:00
Vadim Lopatin 2af89ce369 fix errors; upgrade DCD deps 2018-10-05 09:37:00 +03:00
Vadim Lopatin 06949bef98 update version and dlangui dependency 2018-10-04 13:06:24 +03:00
Vadim Lopatin 1119c32e61
Merge pull request #383 from cschlote/fix-phobos-path-getcwd
Fix access to private std.path.getcwd
2018-10-02 15:02:08 +03:00
Carsten Schlote d89ca3e739 Fix access to private std.path.getcwd 2018-09-19 16:01:32 +02:00
Vadim Lopatin da20313a1b
Merge pull request #379 from WookeyBiscotti/caret_navigation_commands
Add caret navigation
2018-06-13 16:50:57 +03:00
Alex Savchenko 93545717ed Add caret navigation 2018-06-07 22:12:32 +03:00
Vadim Lopatin 0391aa9ae8 update dlangui deps; update version 2018-05-08 11:44:57 +03:00
Vadim Lopatin dbb731fa7b
Merge pull request #372 from Marko10-000/master
Add German language
2018-05-08 10:31:38 +03:00
Vadim Lopatin 6c32105caf
Merge pull request #374 from Zevenberge/feature/add_folder
Create a directory and package.d
2018-05-08 10:31:15 +03:00
Vadim Lopatin 634c024ab1
Merge pull request #371 from rjframe/installer
Add Inno Setup installer script.
2018-05-08 10:30:55 +03:00
Zevenberge 31d9771a08 Merge branch 'master' into feature/add_folder 2018-05-05 11:55:41 +02:00
Zevenberge 4640e093c3 Selects the new folder on creation. Also opens parent folder if not open 2018-05-05 11:55:16 +02:00
Marko Semet a542844b97 Improved German translation for QUESTION_NEW_WORKSPACE
Transformed sentence from feminine to masculine. "verwendet" seams to
sound better than "benutzt".
2018-04-20 12:48:23 +02:00
Marko Semet b4a9fbb431 German language 2018-04-10 14:46:36 +02:00
Ryan Frame ed64d56a79 Add inno setup installer script.
This will install DlangIDE, and optionally download and install DMD.
2018-04-10 07:20:07 -04:00
Vadim Lopatin d684feac14 update dlangui deps 2018-03-20 16:36:12 +03:00
Marco de Wild bf04e91293 Converted tabs to spaces 2017-12-29 14:17:13 +01:00
Marco de Wild 92990e5352 The newly added folder is now placed appropiately 2017-12-29 11:38:48 +01:00
Zevenberge 4f69a40530 Changed the UI options and added english terms 2017-12-23 18:42:19 +01:00
Zevenberge a92a253481 The new package also opens and it added to the tree 2017-12-23 18:26:46 +01:00
Zevenberge 87d5a88a0c Adding a default package.d now works 2017-12-23 18:09:04 +01:00
Zevenberge 85995f9baf Merge branch 'master' into feature/add_folder 2017-12-07 21:37:46 +01:00
Zevenberge 4634fcf90d Scaled the screen a bit better 2017-12-07 21:36:09 +01:00
Zevenberge f4f1a6939c Removed action new source file on project root level
As the IDE no longer searches for the source folder, a file cannot be placed here.
2017-12-02 22:45:46 +01:00
Zevenberge 2e9304727d Update VisualD project to include the new file 2017-12-02 22:17:54 +01:00
Zevenberge 2cd4bc1416 Commented the folder creation at project root level
The files are project root are not shown (i.e. README files). Therefore, if you make a folder, it doesn't appear in the UI. The functionality is tested and works, but the scanning of root-level files should be implemented first (more importantly, a descision should be taken which files to show).
2017-12-02 22:07:46 +01:00
Zevenberge 39ac4deb5d The root ProjectFolder now has the name of the folder
It used to have the full file path of the dub.json file.
2017-12-02 21:50:21 +01:00
Zevenberge c1f4a3b1c2 Folder added to its parent without reloading the whole workspace
As we know the parant, we can simple add a child to it. There is no need to reload the workspace. I also took the liberty of renaming refreshWorkspace to updateTreeGraph, to avoid confusion between updating the tree graph and reloading the workspace from disk.
2017-12-02 21:49:08 +01:00
Zevenberge 2bf34ed691 A folder can now be created on all levels
It creates a folder below the folder/project that is selected. ProjectFolder is now no longer set when the project is selected; this allows folder creation at the highest level (i.e. myproj/views instead of myproj/source/views). It is created on disk, but doesn't show up in the workspace yet.
2017-11-30 21:21:24 +01:00
Zevenberge 3900fd4a34 Added new directory to the right-click menu 2017-11-30 18:57:09 +01:00
40 changed files with 1278 additions and 489 deletions

4
.gitignore vendored
View File

@ -20,3 +20,7 @@ index.html
api.html
screenshots.html
*.log
*.userprefs
\.dlangidews\.wssettings

3
.gitmodules vendored
View File

@ -1,3 +0,0 @@
[submodule "deps/DCD"]
path = deps/DCD
url = https://github.com/Hackerpilot/DCD.git

1
deps/DCD vendored

@ -1 +0,0 @@
Subproject commit cbcc6faac3f820bb8e06ed132d82d13036e34d58

View File

@ -443,6 +443,7 @@
<Link>3rdparty\dsymbol\symbols.d</Link>
</Compile>
<Compile Include="src\dlangide\ui\terminal.d" />
<Compile Include="src\dlangide\ui\newfolder.d" />
</ItemGroup>
<ItemGroup>
<Folder Include="src\ddebug\gdb\" />

140
dlangide.iss Normal file
View File

@ -0,0 +1,140 @@
; Inno Setup script for DlangIDE.
; Installs DlangIDE and the Mago debugger, and optionally
; downloads and installs DMD.
[Setup]
AppName=DlangIDE
AppId=DlangIDE
; The following version numbers need to be updated on each release.
AppVerName=0.8.11
AppVersion=0.8.11
AppPublisher=Vadim Lopatin
AppPublisherURL=https://github.com/buggins/dlangui
AppSupportURL=https://github.com/buggins/dlangui
AppUpdatesURL=https://github.com/buggins/dlangui
AppCopyright=Copyright (C) 2015-2018 Vadim Lopatin
LicenseFile=LICENSE.txt
SetupMutex=DLangIDESetupMutex
; Require at least Windows 7.
MinVersion=6.1
DefaultDirName={pf}\DlangIDE
DefaultGroupName=DLangIDE
Compression=lzma2/normal
ShowComponentSizes=yes
AllowNetworkDrive=no
ChangesEnvironment=yes
ChangesAssociations=yes
[Types]
Name: "dlangide"; Description: "Install DlangIDE."; Flags: iscustom
[Components]
Name: "dlangide"; Description: "DlangIDE and tools"; Types: dlangide; Flags: fixed
Name: "dmd"; Description: "DMD compiler"; Types: dlangide; Check: IsCompilerNeeded;
[Files]
Source: "bin\dlangide.exe"; DestDir: "{app}"; Components: dlangide
Source: "bin\libfreetype-6.dll"; DestDir: "{app}"; Components: dlangide
Source: "bin\mago-mi.exe"; DestDir: "{app}"; Components: dlangide
Source: "views\res\mdpi\dlangui-shortcut1.ico"; DestDir: "{app}"; Components: dlangide
[Registry]
; Associate .dlangidews files with DlangIDE.
Root: HKCR; Subkey: ".dlangidews"; ValueType: String; ValueName: ""; ValueData: "DlangIDEProjectFile"; Tasks: associate; Flags: uninsdeletevalue
Root: HKCR; Subkey: "DlangIDEProjectFile"; ValueType: String; ValueName: ""; ValueData: "DlangIDE Project File"; Tasks: associate; Flags: uninsdeletekey
Root: HKCR; Subkey: "DlangIDEProjectFile\DefaultIcon"; ValueType: String; ValueName: ""; ValueData: "{app}\dlangui-shortcut1.ico"; Tasks: associate; Flags: uninsdeletekey
Root: HKCR; Subkey: "DlangIDEProjectFile\shell\open\command"; ValueType: String; ValueName: ""; ValueData: """{app}\dlangide.exe"" ""%1"""; Tasks: associate; Flags: uninsdeletekey
[Icons]
Name: "{commondesktop}\DlangIDE"; Filename: "{app}\dlangide.exe"; IconFileName: "{app}\dlangui-shortcut1.ico"; Tasks: desktopicon
[Tasks]
Name: desktopicon; Description: "Create a &desktop icon"; Components: dlangide; Flags: checkedonce unchecked
Name: associate; Description: "Associate DlangIDE &Workspace Files"; Components: dlangide; Flags: checkedonce
[Run]
Filename: "{tmp}\dmd-installer.exe"; StatusMsg: "Installing DMD..."; Components: dmd; Flags: 32bit; BeforeInstall: DownloadDMD
[Code]
{
See if we have a registry key for D or if the default installation directory
exists.
}
function IsCompilerNeeded(): Boolean;
begin
Result := not (RegKeyExists(HKCU, 'Software\DMD')
or DirExists(ExpandConstant('{sd}\D\dmd2')))
end;
{ Windows API function to download files from the Internet. }
function URLDownloadToFile(
pCaller: Integer;
szUrl: String;
szFileName: String;
dwReserved: Integer;
lpfnCB: Integer
): Integer;
#ifdef UNICODE
external 'URLDownloadToFileW@urlmon.dll';
#else
external 'URLDownloadToFileA@urlmon.dll';
#endif
{
Convenience procedure to download files; this hides parameters we don't care
about.
We assume the download is successful; if this fails, a later attempt to read
the file will display an error to the user.
}
procedure DownloadFile(url: String; dest: String);
begin
URLDownloadToFile(0, url, ExpandConstant(dest), 0, 0);
end;
procedure DownloadDMD();
var
dmdVersion: AnsiString;
#ifdef UNICODE
dmdVersionU: String;
#else
dmdVersionU: AnsiString;
#endif
begin
DownloadFile('http://downloads.dlang.org/releases/LATEST', '{tmp}\latest.txt');
if LoadStringFromFile(ExpandConstant('{tmp}\latest.txt'), dmdVersion) then
begin
#ifdef UNICODE
dmdVersionU := String(dmdVersion);
#else
dmdVersionU := dmdVersion;
#endif
DownloadFile(
'http://downloads.dlang.org/releases/2.x/'
+ dmdVersionU
+ '/dmd-'
+ dmdVersionU
+ '.exe',
'{tmp}\dmd-installer.exe')
end
else
MsgBox(
'Unable to download dmd installer.'
+ ' Please download and install from dlang.org.',
mbInformation, MB_OK);
end;

View File

@ -938,6 +938,7 @@
<File path="src\dlangide\ui\frame.d" />
<File path="src\dlangide\ui\homescreen.d" />
<File path="src\dlangide\ui\newfile.d" />
<File path="src\dlangide\ui\newfolder.d" />
<File path="src\dlangide\ui\newproject.d" />
<File path="src\dlangide\ui\outputpanel.d" />
<File path="src\dlangide\ui\searchPanel.d" />

View File

@ -12,9 +12,8 @@
"stringImportPaths": ["views"],
"dependencies": {
"dlangui": "==0.9.173",
"dsymbol": "~>0.2.9",
"dcd": "~>0.9.1"
"dlangui": "~>0.10.3",
"dcd": "~>0.16.0-beta.1"
},
"copyFiles-windows": [

View File

@ -69,7 +69,7 @@ class BasicTypeX : Lexem {
in {
assert(isBasicTypeXToken(token));
}
body {
do {
_token = token;
}
}
@ -97,7 +97,7 @@ class TypeCtor : Lexem {
in {
assert(isTypeCtorToken(token));
}
body {
do {
_token = token;
}
}
@ -112,14 +112,14 @@ class TypeCtors : Lexem {
in {
assert(isTypeCtorToken(token));
}
body {
do {
_list ~= new TypeCtor(token);
}
public void append(Token token)
in {
assert(isTypeCtorToken(token));
}
body {
do {
_list ~= new TypeCtor(token);
}
}
@ -134,7 +134,7 @@ class Identifier : Lexem {
in {
assert(identifier.type == TokenType.IDENTIFIER);
}
body {
do {
_token = cast(IdentToken)identifier;
}
}
@ -157,14 +157,14 @@ class IdentifierList : Lexem {
in {
assert(ident.type == TokenType.IDENTIFIER);
}
body {
do {
_identifier = new Identifier(ident);
_identifierList = identifierList;
}
public this(TemplateInstance templateInstance, IdentifierList identifierList = null)
in {
}
body {
do {
_templateInstance = templateInstance;
_identifierList = identifierList;
}
@ -181,7 +181,7 @@ class TemplateInstance : Lexem {
public this()
in {
}
body {
do {
}
}
@ -207,7 +207,7 @@ class BasicType : Lexem {
public this()
in {
}
body {
do {
}
}
@ -228,7 +228,7 @@ class Typeof : Lexem {
public this(Expression expression)
in {
}
body {
do {
_expression = expression;
}
}
@ -245,7 +245,7 @@ class Type : Lexem {
public this()
in {
}
body {
do {
}
}
@ -259,7 +259,7 @@ class Expression : Lexem {
public this()
in {
}
body {
do {
}
}
@ -273,7 +273,7 @@ class AltDeclarator : Lexem {
public this()
in {
}
body {
do {
}
}

View File

@ -6,7 +6,15 @@ import std.conv;
import dlangide.ui.frame;
import dlangide.ui.commands;
import dlangide.workspace.workspace;
static if(__VERSION__ > 2100)
{
import std.logger;
}
else
{
import std.experimental.logger;
}
mixin APP_ENTRY_POINT;
@ -26,18 +34,20 @@ extern (C) int UIAppMain(string[] args) {
runParserTests();
}
version(Windows) {
static if(__VERSION__ > 2100) {
debug {
sharedLog = cast(shared)new FileLogger("dcd.log");
} else {
sharedLog = cast(shared)new NullLogger();
}
}
else
{
debug {
sharedLog = new FileLogger("dcd.log");
} else {
sharedLog = new NullLogger();
}
} else {
debug {
//sharedLog = new FileLogger("dcd.log");
} else {
sharedLog = new NullLogger();
}
}
//version (Windows) {

View File

@ -15,15 +15,10 @@ import std.experimental.allocator;
import std.experimental.allocator.mallocator;
import std.experimental.allocator.gc_allocator;
import server.autocomplete;
import common.messages;
import dcd.server.autocomplete;
import dcd.common.messages;
import dsymbol.modulecache;
//alias SharedASTAllocator = CAllocatorImpl!(Mallocator);
//alias SharedASTAllocator = CAllocatorImpl!(Mallocator);
//alias SharedASTAllocator = CSharedAllocatorImpl!(Mallocator);
alias SharedASTAllocator = ASTAllocator;
enum DCDResult : int {
SUCCESS,
NO_RESULT,
@ -92,11 +87,9 @@ class DCDTask {
}
class ModuleCacheAccessor {
import dsymbol.modulecache;
//protected ASTAllocator _astAllocator;
protected ModuleCache _moduleCache;
this(in string[] importPaths) {
_moduleCache = ModuleCache(new SharedASTAllocator);
_moduleCache = ModuleCache();
_moduleCache.addImportPaths(importPaths);
}
protected ModuleCache * getModuleCache(in string[] importPaths) {
@ -109,8 +102,6 @@ class ModuleCacheAccessor {
class DCDInterface : Thread {
import dsymbol.modulecache;
//protected ASTAllocator _astAllocator;
//protected ModuleCache * _moduleCache;
ModuleCacheAccessor _moduleCache;
protected BlockingQueue!DCDTask _queue;
@ -238,7 +229,7 @@ class DCDInterface : Thread {
override void performRequest() {
AutocompleteResponse response = getDoc(request, *getModuleCache(_importPaths));
result.docComments = response.docComments.dup;
//result.docComments = response.docComments.dup; TODO_GRIM: Fix
result.result = DCDResult.SUCCESS;
debug(DCD) Log.d("DCD doc comments:\n", result.docComments);
@ -318,11 +309,9 @@ class DCDInterface : Thread {
result.output.length = response.completions.length;
int i=0;
foreach(s;response.completions) {
char type = 0;
if (i < response.completionKinds.length)
type = response.completionKinds[i];
char type = s.kind;
result.output[i].kind = type;
result.output[i].name = to!dstring(s);
result.output[i].name = to!dstring(s.identifier);
i++;
}
if (response.completionType == "calltips") {
@ -364,6 +353,7 @@ int completionTypePriority(char t) {
return 3;
case 'k': // - keyword, built-in version, scope statement
return 20;
case 'F':
case 'f': // - function or method
return 2;
case 'g': // - enum name

View File

@ -117,6 +117,7 @@ class DEditorTool : EditorTool
auto destPos = byteOffsetToCaret(content, target);
_frame.currentEditor.setCaretPos(destPos.line,destPos.pos, true, true);
_frame.currentEditor.setFocus();
_frame.caretHistory.pushNewPosition();
break;
default:
break;

View File

@ -6,6 +6,7 @@ import dlangui.widgets.editors;
enum IDEActions : int {
//ProjectOpen = 1010000,
FileNew = 1010000,
FileNewDirectory,
FileNewWorkspace,
FileNewProject,
FileOpen,
@ -71,6 +72,8 @@ enum IDEActions : int {
GetDocComments,
GetParenCompletion,
GotoLine,
GotoNextPosition,
GotoPrevPosition,
InsertCompletion,
FindInFiles,
@ -100,6 +103,7 @@ const Action ACTION_PROJECT_FOLDER_COLLAPSE_ALL = new Action(IDEActions.ProjectF
const Action ACTION_FILE_WORKSPACE_CLOSE = new Action(IDEActions.CloseWorkspace, "MENU_FILE_WORKSPACE_CLOSE"c).disableByDefault();
const Action ACTION_FILE_NEW_DIRECTORY = new Action(IDEActions.FileNewDirectory, "MENU_FILE_NEW_DIRECTORY"c);
const Action ACTION_FILE_NEW_SOURCE_FILE = new Action(IDEActions.FileNew, "MENU_FILE_NEW_SOURCE_FILE"c, "document-new", KeyCode.KEY_N, KeyFlag.Control);
const Action ACTION_FILE_NEW_PROJECT = new Action(IDEActions.FileNewProject, "MENU_FILE_NEW_PROJECT"c);
const Action ACTION_FILE_NEW_WORKSPACE = new Action(IDEActions.FileNewWorkspace, "MENU_FILE_NEW_WORKSPACE"c);
@ -174,7 +178,9 @@ const Action ACTION_GET_DOC_COMMENTS = (new Action(IDEActions.GetDocComments, "
const Action ACTION_GO_TO_DEFINITION = (new Action(IDEActions.GoToDefinition, "GO_TO_DEFINITION"c, ""c, KeyCode.KEY_G, KeyFlag.Control)).addAccelerator(KeyCode.F12, 0).disableByDefault();
const Action ACTION_GET_COMPLETIONS = (new Action(IDEActions.GetCompletionSuggestions, "SHOW_COMPLETIONS"c, ""c, KeyCode.KEY_G, KeyFlag.Control|KeyFlag.Shift)).addAccelerator(KeyCode.SPACE, KeyFlag.Control).disableByDefault();
const Action ACTION_GET_PAREN_COMPLETION = (new Action(IDEActions.GetParenCompletion, "SHOW_PAREN_COMPLETION"c, ""c, KeyCode.SPACE, KeyFlag.Control|KeyFlag.Shift)).disableByDefault();
const Action ACTION_GO_TO_LINE = (new Action(IDEActions.GotoLine, "GO_TO_LINE"c, ""c, KeyCode.KEY_L, KeyFlag.Control|KeyFlag.Option)).disableByDefault();;
const Action ACTION_GO_TO_LINE = (new Action(IDEActions.GotoLine, "GO_TO_LINE"c, ""c, KeyCode.KEY_L, KeyFlag.Control|KeyFlag.Option)).disableByDefault();
const Action ACTION_GO_TO_PREV_POSITION = (new Action(IDEActions.GotoPrevPosition, "GO_TO_PREV_POSITION"c, ""c, KeyCode.LEFT, KeyFlag.Alt)).disableByDefault();
const Action ACTION_GO_TO_NEXT_POSITION = (new Action(IDEActions.GotoNextPosition, "GO_TO_NEXT_POSITION"c, ""c, KeyCode.RIGHT, KeyFlag.Alt)).disableByDefault();
const Action ACTION_FIND_TEXT = (new Action(IDEActions.FindInFiles, "FIND_IN_FILES"c, "edit-find"c, KeyCode.KEY_F, KeyFlag.Control | KeyFlag.Shift)).disableByDefault();
const Action ACTION_TOOLS_OPEN_DMD_TRACE_LOG = (new Action(IDEActions.ToolsOpenDMDTraceLog, "OPEN_DMD_TRACE_LOG"c));
@ -202,5 +208,7 @@ const Action[] STD_IDE_ACTIONS = [
ACTION_GET_COMPLETIONS,
ACTION_GET_PAREN_COMPLETION,
ACTION_GO_TO_LINE,
ACTION_GO_TO_PREV_POSITION,
ACTION_GO_TO_NEXT_POSITION,
ACTION_FIND_TEXT,
];

View File

@ -43,7 +43,7 @@ class DMDProfilerView : WidgetGroupDefaultDrawing {
class TraceFuncionGrid : StringGridWidgetBase {
protected FunctionNode[] _list;
protected dstring[] _colTitles;
protected UIString[] _colTitles;
protected ulong _ticksPerSecond;
this(string ID, FunctionNode[] list, ulong ticks_per_second) {
super(ID);
@ -53,10 +53,10 @@ class TraceFuncionGrid : StringGridWidgetBase {
fullColumnOnLeft(false);
fullRowOnTop(false);
resize(4, cast(int)list.length);
setColTitle(0, "Function name"d);
setColTitle(1, "Called"d);
setColTitle(2, "F us"d);
setColTitle(3, "F+D us"d);
setColTitle(0, UIString.fromRaw("Function name"));
setColTitle(1, UIString.fromRaw("Called"));
setColTitle(2, UIString.fromRaw("F us"));
setColTitle(3, UIString.fromRaw("F+D us"));
showRowHeaders = false;
rowSelect = true;
minVisibleRows = 10;
@ -80,54 +80,54 @@ class TraceFuncionGrid : StringGridWidgetBase {
buffer[i] = buf[k - i - 1];
return cast(dstring)buffer[0..k];
}
dstring formatDurationTicks(ulong n) {
auto formatDurationTicks(ulong n) {
ulong v = n * 1000000 / _ticksPerSecond;
return formatNumber(v, _numberFormatBuf[]);
return UIString.fromRaw(formatNumber(v, _numberFormatBuf[]));
}
/// get cell text
override dstring cellText(int col, int row) {
override UIString cellText(int col, int row) {
import std.conv : to;
if (row < 0 || row >= _list.length)
return ""d;
return UIString.fromRaw(""d);
FunctionNode entry = _list[row];
switch (col) {
case 0:
string fn = entry.name;
if (fn.length > 256)
fn = fn[0..256] ~ "...";
return fn.to!dstring;
return UIString.fromRaw(fn.to!dstring);
case 1:
return formatNumber(entry.number_of_calls, _numberFormatBuf);
return UIString.fromRaw(formatNumber(entry.number_of_calls, _numberFormatBuf));
case 2:
return formatDurationTicks(entry.function_time);
case 3:
return formatDurationTicks(entry.function_and_descendant_time);
default:
return ""d;
return UIString.fromRaw(""d);
}
}
/// set cell text
override StringGridWidgetBase setCellText(int col, int row, dstring text) {
override StringGridWidgetBase setCellText(int col, int row, UIString text) {
// do nothing
return this;
}
/// returns row header title
override dstring rowTitle(int row) {
return ""d;
override UIString rowTitle(int row) {
return UIString.fromRaw(""d);
}
/// set row header title
override StringGridWidgetBase setRowTitle(int row, dstring title) {
override StringGridWidgetBase setRowTitle(int row, UIString title) {
return this;
}
/// returns row header title
override dstring colTitle(int col) {
override UIString colTitle(int col) {
return _colTitles[col];
}
/// set col header title
override StringGridWidgetBase setColTitle(int col, dstring title) {
override StringGridWidgetBase setColTitle(int col, UIString title) {
_colTitles[col] = title;
return this;
}

View File

@ -641,7 +641,8 @@ class DSourceEdit : SourceEdit, EditableContentMarksChangeListener {
return;
}
if (suggestions.length == 1) {
// Only insert singular autocompletion if automatic autocomplete is turned off!
if (!_settings.autoAutoComplete && suggestions.length == 1) {
insertCompletion(suggestions[0]);
return;
}
@ -721,13 +722,25 @@ class DSourceEdit : SourceEdit, EditableContentMarksChangeListener {
super.handleFocusChange(focused, receivedFocusFromKeyboard);
}
private bool isAutoCompleteKey(ref KeyEvent event) {
if((event.keyCode >= KeyCode.KEY_0 && event.keyCode <= KeyCode.KEY_Z) ||
event.keyCode == KeyCode.KEY_PERIOD ||
event.keyCode == KeyCode.BACK ||
event.text == "_")
return true;
return false;
}
protected uint _lastKeyDownCode;
protected uint _periodKeyCode;
/// handle keys: support autocompletion after . press with delay
override bool onKeyEvent(KeyEvent event) {
if (event.action == KeyAction.KeyDown)
_lastKeyDownCode = event.keyCode;
if (event.action == KeyAction.Text && event.noModifiers && event.text==".") {
if(_settings.autoAutoComplete && isAutoCompleteKey(event) && !_completionPopup) {
window.dispatchAction(ACTION_GET_COMPLETIONS, this);
}
else if (event.action == KeyAction.Text && event.noModifiers && event.text==".") {
_periodKeyCode = _lastKeyDownCode;
startCompletionTimer();
} else {
@ -790,7 +803,7 @@ class CompletionPopupMenu : PopupMenu {
MenuItem updateItems() {
MenuItem res = new MenuItem();
foreach(int i, dstring suggestion ; _suggestions) {
foreach(i, dstring suggestion ; _suggestions) {
if (_prefix.length && !suggestion.startsWith(_prefix))
continue;
string iconId;
@ -806,19 +819,12 @@ class CompletionPopupMenu : PopupMenu {
/// handle keys
override bool onKeyEvent(KeyEvent event) {
if (event.action == KeyAction.Text) {
_prefix ~= event.text;
MenuItem newItems = updateItems();
if (newItems.subitemCount == 0) {
// no matches anymore
_editor.onKeyEvent(event);
_editor.closeCompletionPopup(this);
return true;
} else {
_editor.onKeyEvent(event);
menuItems = newItems;
selectItem(0);
} else if (event.keyCode == KeyCode.ESCAPE) {
_editor.closeCompletionPopup(this);
return true;
}
} else if (event.action == KeyAction.KeyDown && event.keyCode == KeyCode.BACK && event.noModifiers) {
if (_prefix.length > _initialPrefix.length) {
_prefix.length = _prefix.length - 1;
@ -831,8 +837,8 @@ class CompletionPopupMenu : PopupMenu {
_editor.closeCompletionPopup(this);
}
return true;
} else if (event.action == KeyAction.KeyDown && event.keyCode == KeyCode.RETURN) {
} else if (event.action == KeyAction.KeyDown && event.keyCode == KeyCode.SPACE) {
} else if ((event.action == KeyAction.KeyDown && event.keyCode == KeyCode.RETURN) ||
(event.action == KeyAction.KeyDown && event.keyCode == KeyCode.SPACE)) {
}
return super.onKeyEvent(event);
}

View File

@ -21,6 +21,7 @@ import dlangide.ui.commands;
import dlangide.ui.wspanel;
import dlangide.ui.outputpanel;
import dlangide.ui.newfile;
import dlangide.ui.newfolder;
import dlangide.ui.newproject;
import dlangide.ui.dsourceedit;
import dlangide.ui.homescreen;
@ -107,6 +108,7 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
window.onCanClose = &onCanClose;
window.onClose = &onWindowClose;
applySettings(_settings);
caretHistory = new CaretHistory;
}
~this() {
@ -400,8 +402,10 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
Log.d("found source file");
if (sourceFile)
_wsPanel.selectItem(sourceFile);
caretHistory.pushNewPosition();
currentEditor().setCaretPos(line, 0);
currentEditor().setCaretPos(line, column);
caretHistory.pushNewPosition();
}
return true;
}
@ -416,6 +420,13 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
}
}
bool tryOpenSourceFile(string filename) {
if (isSupportedSourceTextFileFormat(filename)) {
return openSourceFile(filename, null, true);
}
return false;
}
bool openSourceFile(string filename, ProjectSourceFile file = null, bool activate = true) {
if (!file && !filename)
return false;
@ -762,7 +773,7 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
MenuItem navItem = new MenuItem(new Action(21, "MENU_NAVIGATE"));
navItem.add(ACTION_GO_TO_DEFINITION, ACTION_GET_COMPLETIONS, ACTION_GET_DOC_COMMENTS,
ACTION_GET_PAREN_COMPLETION, ACTION_EDITOR_GOTO_PREVIOUS_BOOKMARK,
ACTION_EDITOR_GOTO_NEXT_BOOKMARK, ACTION_GO_TO_LINE);
ACTION_EDITOR_GOTO_NEXT_BOOKMARK, ACTION_GO_TO_LINE, ACTION_GO_TO_PREV_POSITION, ACTION_GO_TO_NEXT_POSITION);
MenuItem projectItem = new MenuItem(new Action(21, "MENU_PROJECT"));
projectItem.add(ACTION_PROJECT_SET_STARTUP, ACTION_PROJECT_REFRESH, ACTION_PROJECT_UPDATE_DEPENDENCIES, ACTION_PROJECT_SETTINGS);
@ -980,6 +991,8 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
case IDEActions.FileSaveAll:
case IDEActions.FileSaveAs:
case IDEActions.GotoLine:
case IDEActions.GotoPrevPosition:
case IDEActions.GotoNextPosition:
case EditorActions.Find:
case EditorActions.FindNext:
case EditorActions.FindPrev:
@ -1137,7 +1150,7 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
else
ed.editorTool = new DefaultEditorTool(this);
//openSourceFile(filename);
refreshWorkspace();
updateTreeGraph();
ProjectSourceFile file = _wsPanel.findSourceFileItem(filename, false);
if (file) {
ed.projectSourceFile = file;
@ -1209,7 +1222,7 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
buildProject(BuildOperation.Upgrade, cast(Project)a.objectParam);
return true;
case IDEActions.RefreshProject:
refreshWorkspace();
updateTreeGraph();
return true;
case IDEActions.RevealProjectInExplorer:
revealProjectInExplorer(cast(Project)a.objectParam);
@ -1276,6 +1289,7 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
case IDEActions.GoToDefinition:
if (currentEditor) {
Log.d("Trying to go to definition.");
caretHistory.pushNewPosition();
currentEditor.editorTool.goToDefinition(currentEditor(), currentEditor.caretPos);
}
return true;
@ -1294,8 +1308,10 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
return;
}
// Go to line
caretHistory.pushNewPosition();
currentEditor.setCaretPos(num - 1, 0);
currentEditor.setFocus();
caretHistory.pushNewPosition();
}
catch (ConvException e) {
currentEditor.setFocus();
@ -1304,6 +1320,18 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
});
}
return true;
case IDEActions.GotoPrevPosition:
if (currentEditor) {
Log.d("Go to prev position");
caretHistory.moveToPrev();
}
return true;
case IDEActions.GotoNextPosition:
if (currentEditor) {
Log.d("Go to next position");
caretHistory.moveToNext();
}
return true;
case IDEActions.GetDocComments:
Log.d("Trying to get doc comments.");
currentEditor.editorTool.getDocComments(currentEditor, currentEditor.caretPos, delegate(string[] results) {
@ -1365,7 +1393,10 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
createNewProject(false);
return true;
case IDEActions.FileNew:
addProjectItem(cast(Object)a.objectParam);
addFile(cast(Object)a.objectParam);
return true;
case IDEActions.FileNewDirectory:
addDirectory(cast(Object)a.objectParam);
return true;
case IDEActions.ProjectFolderRemoveItem:
removeProjectItem(a.objectParam);
@ -1433,7 +1464,7 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
if (cast(Workspace)obj) {
Workspace ws = cast(Workspace)obj;
ws.refresh();
refreshWorkspace();
updateTreeGraph();
} else if (cast(Project)obj) {
project = cast(Project)obj;
} else if (cast(ProjectFolder)obj) {
@ -1452,7 +1483,7 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
}
if (project) {
project.refresh();
refreshWorkspace();
updateTreeGraph();
}
}
@ -1479,7 +1510,7 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
Log.e("Cannot remove file");
}
project.refresh();
refreshWorkspace();
updateTreeGraph();
}
// else ignore
return true;
@ -1487,8 +1518,53 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
}
private void addFile(Object obj) {
Dialog createNewFileDialog(Project project, ProjectFolder folder) {
NewFileDlg dialog = new NewFileDlg(this, project, folder);
dialog.dialogResult = delegate(Dialog dlg, const Action result) {
if (result.id == ACTION_FILE_NEW_SOURCE_FILE.id) {
FileCreationResult res = cast(FileCreationResult)result.objectParam;
if (res) {
//res.project.reload();
res.project.refresh();
updateTreeGraph();
tryOpenSourceFile(res.filename);
}
}
};
return dialog;
}
addProjectItem(&createNewFileDialog, obj);
}
private void addDirectory(Object obj) {
Dialog createNewDirectoryDialog(Project project, ProjectFolder folder) {
NewFolderDialog dialog = new NewFolderDialog(this, project, folder);
dialog.dialogResult = delegate(Dialog dlg, const Action result) {
if(result.id == ACTION_FILE_NEW_DIRECTORY.id) {
FileCreationResult res = cast(FileCreationResult)result.objectParam;
if (res) {
ProjectFolder newFolder = new ProjectFolder(res.filename);
if(folder) {
folder.addChild(newFolder);
folder.sortItems;
newFolder.refresh();
if(newFolder.childCount > 0){
tryOpenSourceFile(newFolder.child(0).filename);
}
}
updateTreeGraph();
_wsPanel.selectItem(newFolder);
}
}
};
return dialog;
}
addProjectItem(&createNewDirectoryDialog, obj);
}
/// add new file to project
void addProjectItem(Object obj) {
private void addProjectItem(Dialog delegate(Project, ProjectFolder) dialogFactory, Object obj) {
if (currentWorkspace is null)
return;
if (obj is null && _wsPanel !is null && !currentEditorSourceFile) {
@ -1500,7 +1576,12 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
ProjectFolder folder;
if (cast(Project)obj) {
project = cast(Project)obj;
folder = project.firstSourceFolder;
folder = project.items;
import std.stdio;
writeln("Root filename:", folder.filename);
for(int i = 0; i < folder.childCount; i++) {
writeln("Child [", i, "]: ", folder.child(i).filename);
}
} else if (cast(ProjectFolder)obj) {
folder = cast(ProjectFolder)obj;
project = folder.project;
@ -1515,21 +1596,8 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
project = srcfile.project;
}
}
if (project && folder && project.workspace is currentWorkspace) {
NewFileDlg dlg = new NewFileDlg(this, project, folder);
dlg.dialogResult = delegate(Dialog dlg, const Action result) {
if (result.id == ACTION_FILE_NEW_SOURCE_FILE.id) {
FileCreationResult res = cast(FileCreationResult)result.objectParam;
if (res) {
//res.project.reload();
res.project.refresh();
refreshWorkspace();
if (isSupportedSourceTextFileFormat(res.filename)) {
openSourceFile(res.filename, null, true);
}
}
}
};
if (project && project.workspace is currentWorkspace) {
Dialog dlg = dialogFactory(project, folder);
dlg.show();
}
}
@ -1550,12 +1618,12 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
if (currentWorkspace is null || res.workspace !is currentWorkspace) {
// open new workspace
setWorkspace(res.workspace);
refreshWorkspace();
updateTreeGraph();
hideHomeScreen();
} else {
// project added to current workspace
loadProject(res.project);
refreshWorkspace();
updateTreeGraph();
hideHomeScreen();
}
}
@ -1757,7 +1825,7 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
currentWorkspace.addProject(project);
loadProject(project);
currentWorkspace.save();
refreshWorkspace();
updateTreeGraph();
hideHomeScreen();
}
return true;
@ -1772,7 +1840,7 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
}
}
void refreshWorkspace() {
void updateTreeGraph() {
_logPanel.logLine("Refreshing workspace");
_wsPanel.reloadItems();
closeRemovedDocuments();
@ -1838,7 +1906,7 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
void refreshProject(Project project) {
if (currentWorkspace && project.loadSelections()) {
currentWorkspace.cleanupUnusedDependencies();
refreshWorkspace();
updateTreeGraph();
}
}
@ -1981,5 +2049,58 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL
Log.i("onWindowClose()");
stopExecution();
}
static struct CaretPosition {
string filePath;
uint line;
uint pos;
};
class CaretHistory {
private CaretPosition[] caretHistory;
private int currentPos = -1;
private bool checkIfCurentPosIsCurrentHistoryPos() {
if (caretHistory.length == 0) {
return false;
}
return currentEditor.caretPos.line == caretHistory[currentPos].line &&
currentEditor.caretPos.pos == caretHistory[currentPos].pos;
}
void pushNewPosition() {
if (!checkIfCurentPosIsCurrentHistoryPos()) {
pushNewPosition(currentEditor().filename, currentEditor.caretPos.line, currentEditor.caretPos.pos);
}
}
void pushNewPosition(string filePath, uint line, uint pos) {
if (caretHistory.length != 0) {
caretHistory = caretHistory[0..currentPos + 1];
}
caretHistory ~= CaretPosition(filePath, line, pos);
++currentPos;
}
void moveToNext() {
if (currentPos + 1 < caretHistory.length) {
++currentPos;
openSourceFile(caretHistory[currentPos].filePath);
currentEditor.setCaretPos(caretHistory[currentPos].line, caretHistory[currentPos].pos);
currentEditor.setFocus();
}
}
void moveToPrev() {
if (currentPos > 0) {
--currentPos;
openSourceFile(caretHistory[currentPos].filePath);
currentEditor.setCaretPos(caretHistory[currentPos].line, caretHistory[currentPos].pos);
currentEditor.setFocus();
}
}
}
CaretHistory caretHistory;
}

View File

@ -97,7 +97,7 @@ class NewFileDlg : Dialog {
TextWidget { text: OPTION_FILE_PATH }
EditLine { id: edFilePath; text: ""; layoutWidth: fill; readOnly: true }
}
TextWidget { id: statusText; text: ""; layoutWidth: fill; textColor: #FF0000 }
TextWidget { id: statusText; text: ""; layoutWidth: fill; textColor: 0xFF0000 }
}
});
} catch (Exception e) {
@ -198,29 +198,6 @@ class NewFileDlg : Dialog {
ProjectTemplate _currentTemplate;
ProjectTemplate[] _templates;
static bool isSubdirOf(string path, string basePath) {
if (path.equal(basePath))
return true;
if (path.length > basePath.length + 1 && path.startsWith(basePath)) {
char ch = path[basePath.length];
return ch == '/' || ch == '\\';
}
return false;
}
bool findSource(string path, ref string sourceFolderPath, ref string relativePath) {
foreach(dir; _sourcePaths) {
if (isSubdirOf(path, dir)) {
sourceFolderPath = dir;
relativePath = path[sourceFolderPath.length .. $];
if (relativePath.length > 0 && (relativePath[0] == '\\' || relativePath[0] == '/'))
relativePath = relativePath[1 .. $];
return true;
}
}
return false;
}
bool setError(dstring msg) {
_statusText.text = msg;
return msg.empty;
@ -242,25 +219,12 @@ class NewFileDlg : Dialog {
if (_currentTemplate.kind == FileKind.MODULE || _currentTemplate.kind == FileKind.PACKAGE) {
string sourcePath, relativePath;
if (!findSource(_location, sourcePath, relativePath))
if (!findSource(_sourcePaths, _location, sourcePath, relativePath))
return setError("Location is outside of source path");
if (!isValidModuleName(filename))
return setError("Invalid file name");
_moduleName = filename;
char[] buf;
foreach(c; relativePath) {
char ch = c;
if (ch == '/' || ch == '\\')
ch = '.';
else if (ch == '.')
ch = '_';
if (ch == '.' && (buf.length == 0 || buf[$-1] == '.'))
continue; // skip duplicate .
buf ~= ch;
}
if (buf.length && buf[$-1] == '.')
buf.length--;
_packageName = buf.dup;
_packageName = getPackageName(sourcePath, relativePath);
string m;
if (_currentTemplate.kind == FileKind.MODULE) {
m = !_packageName.empty ? _packageName ~ '.' ~ _moduleName : _moduleName;
@ -284,20 +248,10 @@ class NewFileDlg : Dialog {
private FileCreationResult _result;
bool createItem() {
try {
if (_currentTemplate.kind == FileKind.MODULE) {
string txt = "module " ~ _packageName ~ ";\n\n" ~ _currentTemplate.srccode;
write(_fullPathName, txt);
} else if (_currentTemplate.kind == FileKind.PACKAGE) {
string txt = "module " ~ _packageName ~ ";\n\n" ~ _currentTemplate.srccode;
write(_fullPathName, txt);
} else {
write(_fullPathName, _currentTemplate.srccode);
}
} catch (Exception e) {
Log.e("Cannot create file", e);
if(!createFile(_fullPathName, _currentTemplate.kind, _packageName, _currentTemplate.srccode)) {
return setError("Cannot create file");
}
_result = new FileCreationResult(_project, _fullPathName);
return true;
}
@ -377,3 +331,67 @@ class ProjectTemplate {
this.kind = kind;
}
}
bool createFile(string fullPathName, FileKind fileKind, string packageName, string sourceCode) {
try {
if (fileKind == FileKind.MODULE) {
string txt = "module " ~ packageName ~ ";\n\n" ~ sourceCode;
write(fullPathName, txt);
} else if (fileKind == FileKind.PACKAGE) {
string txt = "module " ~ packageName ~ ";\n\n" ~ sourceCode;
write(fullPathName, txt);
} else {
write(fullPathName, sourceCode);
}
return true;
}
catch(Exception e) {
Log.e("Cannot create file", e);
return false;
}
}
string getPackageName(string path, string[] sourcePaths){
string sourcePath, relativePath;
if(!findSource(sourcePaths, path, sourcePath, relativePath)) return "";
return getPackageName(sourcePath, relativePath);
}
string getPackageName(string sourcePath, string relativePath){
char[] buf;
foreach(c; relativePath) {
char ch = c;
if (ch == '/' || ch == '\\')
ch = '.';
else if (ch == '.')
ch = '_';
if (ch == '.' && (buf.length == 0 || buf[$-1] == '.'))
continue; // skip duplicate .
buf ~= ch;
}
if (buf.length && buf[$-1] == '.')
buf.length--;
return buf.dup;
}
private bool findSource(string[] sourcePaths, string path, ref string sourceFolderPath, ref string relativePath) {
foreach(dir; sourcePaths) {
if (isSubdirOf(path, dir)) {
sourceFolderPath = dir;
relativePath = path[sourceFolderPath.length .. $];
if (relativePath.length > 0 && (relativePath[0] == '\\' || relativePath[0] == '/'))
relativePath = relativePath[1 .. $];
return true;
}
}
return false;
}
private bool isSubdirOf(string path, string basePath) {
if (path.equal(basePath))
return true;
if (path.length > basePath.length + 1 && path.startsWith(basePath)) {
char ch = path[basePath.length];
return ch == '/' || ch == '\\';
}
return false;
}

186
src/dlangide/ui/newfolder.d Normal file
View File

@ -0,0 +1,186 @@
module dlangide.ui.newfolder;
import std.array : empty;
import std.file : mkdir, exists;
import std.path : buildPath, buildNormalizedPath;
import std.utf : toUTF32;
import dlangui.core.logger;
import dlangui.core.stdaction;
import dlangui.dialogs.dialog;
import dlangui.dml.parser;
import dlangui.widgets.controls;
import dlangui.widgets.editors;
import dlangui.widgets.widget;
import dlangide.ui.commands;
import dlangide.ui.frame;
import dlangide.ui.newfile;
import dlangide.workspace.project;
class NewFolderDialog : Dialog {
private {
IDEFrame _ide;
Project _project;
ProjectFolder _folder;
string _location;
}
this(IDEFrame parent, Project currentProject, ProjectFolder folder) {
super(UIString.fromId("OPTION_NEW_SOURCE_FILE"c), parent.window,
DialogFlag.Modal | DialogFlag.Popup, 800, 0);
layoutWidth = FILL_PARENT;
_ide = parent;
_icon = "dlangui-logo1";
this._project = currentProject;
this._folder = folder;
if (folder){
_location = folder.filename;
}
else {
_location = currentProject.dir;
}
}
override void initialize() {
super.initialize();
Widget content;
try {
content = parseML(q{
VerticalLayout {
id: vlayout
padding: Rect { 5, 5, 5, 5 }
layoutWidth: fill; layoutHeight: wrap
TableLayout {
margins: 5
colCount: 2
layoutWidth: fill; layoutHeight: wrap
TextWidget { text: NAME }
EditLine { id: fileName; text: "newfolder"; layoutWidth: fill }
CheckBox { id: makePackage }
TextWidget { text: OPTION_MAKE_PACKAGE}
}
TextWidget { id: statusText; text: ""; layoutWidth: fill; textColor: 0xFF0000 }
}
});
} catch (Exception e) {
Log.e("Exceptin while parsing DML", e);
throw e;
}
_edFileName = content.childById!EditLine("fileName");
_edMakePackage = content.childById!CheckBox("makePackage");
_statusText = content.childById!TextWidget("statusText");
_edFileName.enterKey.connect(&onEnterKey);
_edFileName.setDefaultPopupMenu();
_edFileName.contentChange = delegate (EditableContent source) {
updateValues(source.text);
validate();
};
addChild(content);
addChild(createButtonsPanel([ACTION_FILE_NEW_DIRECTORY, ACTION_CANCEL], 0, 0));
updateValues(_edFileName.text);
}
override void onShow() {
super.onShow();
_edFileName.selectAll();
_edFileName.setFocus();
}
protected bool onEnterKey(EditWidgetBase editor) {
if (!validate())
return false;
close(_buttonActions[0]);
return true;
}
private bool validate() {
if (!isValidModuleName(_fileName))
return setError("Invalid folder name");
return setError(null);
}
private void updateValues(dstring fileName) {
_fileName = toUTF8(fileName);
}
private bool setError(dstring msg) {
_statusText.text = msg;
return msg.empty;
}
private {
EditLine _edFileName;
CheckBox _edMakePackage;
TextWidget _statusText;
string _fileName = "newfile";
FileCreationResult _result;
bool shouldMakePackage() @property {
return _edMakePackage.checked;
}
string fullPathName() @property {
return buildNormalizedPath(_location, _fileName);
}
}
private bool createItem() {
string fullPathName = this.fullPathName;
if(exists(fullPathName))
return setError("Folder already exists");
if(!makeDirectory(fullPathName)) return false;
if(shouldMakePackage) {
if(!makePackageFile(fullPathName)) {
return false;
}
}
_result = new FileCreationResult(_project, fullPathName);
return true;
}
private bool makeDirectory(string fullPathName) {
try {
mkdir(fullPathName);
return true;
} catch (Exception e) {
Log.e("Cannot create folder", e);
return setError("Cannot create folder");
}
}
private bool makePackageFile(string fullPathName) {
string packageName = getPackageName(fullPathName, _project.sourcePaths);
if(packageName.empty) {
Log.e("Could not determing package name for ", fullPathName);
return false;
}
if(!createFile(fullPathName.buildPath("package.d"), FileKind.PACKAGE, packageName, null)) {
Log.e("Could not create package file in folder ", fullPathName);
return false;
}
return true;
}
override void close(const Action action) {
Action newaction = action.clone();
if (action.id == IDEActions.FileNewDirectory) {
if (!validate()) {
window.showMessageBox(UIString.fromId("ERROR"c), UIString.fromId("ERROR_INVALID_PARAMETERS"c));
return;
}
if (!createItem()) {
window.showMessageBox(UIString.fromId("ERROR"c), UIString.fromId("ERROR_INVALID_PARAMETERS"c));
return;
}
newaction.objectParam = _result;
}
super.close(newaction);
}
}

View File

@ -362,13 +362,13 @@ class NewProjectDlg : Dialog {
project.name = toUTF32(_projectName);
if (!project.save())
return setError("Cannot save project");
project.content.setString("targetName", _projectName);
project.content.setting.setString("targetName", _projectName);
if (_currentTemplate.isLibrary) {
project.content.setString("targetType", "staticLibrary");
project.content.setString("targetPath", "lib");
project.content.setting.setString("targetType", "staticLibrary");
project.content.setting.setString("targetPath", "lib");
} else {
project.content.setString("targetType", "executable");
project.content.setString("targetPath", "bin");
project.content.setting.setString("targetType", "executable");
project.content.setting.setString("targetPath", "bin");
}
if (_currentTemplate.json)
project.content.merge(_currentTemplate.json);

View File

@ -224,17 +224,17 @@ class CompilerLogWidget : LogWidget {
}
void resolveRelativePath(ref string path, int line) {
import std.path : getcwd, absolutePath;
Log.d("resolveRelativePath ", path, " current directory: ", getcwd);
import std.path : absolutePath;
Log.d("resolveRelativePath ", path);
string prjName = findProjectForLine(line);
if (prjName) {
Log.d("Error is in project ", prjName);
}
string base = _baseDirectory;
if (!base)
base = getcwd;
// TODO: select proper base
path = absolutePath(path, base);
else
path = absolutePath(path);
Log.d("converted to absolute path: ", path);
}
///

View File

@ -352,9 +352,11 @@ class SearchWidget : TabWidget {
line--;
if (line == 0) {
if (_frame.openSourceFile(matchList.filename)) {
_frame.caretHistory.pushNewPosition();
_frame.currentEditor.setCaretPos(match.line, to!int(match.col));
_frame.currentEditor.setTextToHighlight(_findText.text, makeSearchFlags);
_frame.currentEditor.setFocus();
_frame.caretHistory.pushNewPosition();
}
return true;
}
@ -370,11 +372,11 @@ SearchMatchList findMatches(in string filename, in dstring searchString) {
SearchMatchList match;
match.filename = filename;
foreach(int lineIndex, dstring line; content.lines) {
foreach(lineIndex, dstring line; content.lines) {
auto colIndex = line.indexOf(searchString);
if (colIndex != -1) {
match.matches ~= SearchMatch(lineIndex, colIndex, line);
match.matches ~= SearchMatch(cast(int)lineIndex, colIndex, line);
}
}
return match;

View File

@ -75,6 +75,7 @@ SettingsPage createSettingsPages() {
StringListValue("en", "MENU_VIEW_LANGUAGE_EN"c),
StringListValue("ru", "MENU_VIEW_LANGUAGE_RU"c),
StringListValue("es", "MENU_VIEW_LANGUAGE_ES"c),
StringListValue("de", "MENU_VIEW_LANGUAGE_DE"c),
StringListValue("cs", "MENU_VIEW_LANGUAGE_CS"c)]);
// UI font faces
@ -125,6 +126,9 @@ SettingsPage createSettingsPages() {
StringListValue(120, "120"d),
StringListValue(140, "140"d),
StringListValue(150, "150"d),
StringListValue(150, "180"d),
StringListValue(150, "200"d),
StringListValue(150, "250"d),
StringListValue(300, "300"d),
StringListValue(400, "400"d),
StringListValue(600, "600"d)]);
@ -143,6 +147,7 @@ SettingsPage createSettingsPages() {
texted.addCheckbox("editors/textEditor/smartIndentsAfterPaste", UIString.fromId("OPTION_SMART_INDENTS_PASTE"c));
texted.addCheckbox("editors/textEditor/showWhiteSpaceMarks", UIString.fromId("OPTION_SHOW_SPACES"c));
texted.addCheckbox("editors/textEditor/showTabPositionMarks", UIString.fromId("OPTION_SHOW_TABS"c));
texted.addCheckbox("editors/textEditor/autoAutoComplete", UIString.fromId("OPTION_AUTO_AUTOCOMPLETE"c));
// Common page
SettingsPage common = res.addChild("common", UIString.fromId("OPTION_COMMON"c));

View File

@ -102,7 +102,7 @@ class WorkspacePanel : DockWindow {
_projectPopupMenu = new MenuItem();
_projectPopupMenu.add(ACTION_PROJECT_SET_STARTUP,
ACTION_PROJECT_FOLDER_REFRESH,
ACTION_FILE_NEW_SOURCE_FILE,
//ACTION_FILE_NEW_DIRECTORY,
//ACTION_PROJECT_FOLDER_OPEN_ITEM,
ACTION_PROJECT_BUILD,
ACTION_PROJECT_REBUILD,
@ -116,14 +116,17 @@ class WorkspacePanel : DockWindow {
);
_folderPopupMenu = new MenuItem();
_folderPopupMenu.add(ACTION_FILE_NEW_SOURCE_FILE, ACTION_PROJECT_FOLDER_REFRESH, ACTION_PROJECT_FOLDER_OPEN_ITEM,
_folderPopupMenu.add(ACTION_FILE_NEW_SOURCE_FILE,
ACTION_FILE_NEW_DIRECTORY,
ACTION_PROJECT_FOLDER_REFRESH, ACTION_PROJECT_FOLDER_OPEN_ITEM,
ACTION_PROJECT_FOLDER_EXPAND_ALL, ACTION_PROJECT_FOLDER_COLLAPSE_ALL
//ACTION_PROJECT_FOLDER_REMOVE_ITEM,
//ACTION_PROJECT_FOLDER_RENAME_ITEM
);
_filePopupMenu = new MenuItem();
_filePopupMenu.add(ACTION_FILE_NEW_SOURCE_FILE, ACTION_PROJECT_FOLDER_REFRESH,
_filePopupMenu.add(ACTION_FILE_NEW_SOURCE_FILE,
ACTION_PROJECT_FOLDER_REFRESH,
ACTION_PROJECT_FOLDER_OPEN_ITEM,
ACTION_PROJECT_FOLDER_REMOVE_ITEM,
//ACTION_PROJECT_FOLDER_RENAME_ITEM

View File

@ -7,7 +7,7 @@ import dlangui.graphics.fonts;
import std.algorithm : equal;
const AVAILABLE_THEMES = ["ide_theme_default", "ide_theme_dark"];
const AVAILABLE_LANGUAGES = ["en", "ru", "es", "cs"];
const AVAILABLE_LANGUAGES = ["en", "ru", "es", "cs", "de"];
class IDESettings : SettingsFile {
@ -23,6 +23,7 @@ class IDESettings : SettingsFile {
ed.setBooleanDef("smartIndentsAfterPaste", true);
ed.setBooleanDef("showWhiteSpaceMarks", true);
ed.setBooleanDef("showTabPositionMarks", true);
ed.setBooleanDef("autoAutoComplete", true);
ed.setStringDef("fontFace", "Default");
ed.setIntegerDef("fontSize", 11);
Setting ui = uiSettings();
@ -171,6 +172,16 @@ class IDESettings : SettingsFile {
return this;
}
/// Text editor setting, true if auto-complete is triggered on each key press
@property bool autoAutoComplete() {
return editorSettings.getBoolean("autoAutoComplete", true);
}
///
@property IDESettings autoAutoComplete(bool v) {
editorSettings.setBoolean("autoAutoComplete", v);
return this;
}
/// true if smart indents are enabled
@property bool smartIndents() { return editorSettings.getBoolean("smartIndents", true); }
/// set smart indents enabled flag

View File

@ -11,6 +11,7 @@ import std.file;
import std.path;
import std.process;
import std.utf;
import std.ascii : isAlphaNum;
string[] includePath;
@ -422,7 +423,7 @@ class Project : WorkspaceItem {
includePath ~= obj.str;
}
_items = new ProjectFolder(fname);
_items = new ProjectFolder(fname.dirName);
_dependencyVersion = dependencyVersion;
_isDependency = _dependencyVersion.length > 0;
_projectFile = new SettingsFile(fname);
@ -490,7 +491,7 @@ class Project : WorkspaceItem {
/// name
override @property void name(dstring s) {
super.name(s);
_projectFile.setString("name", toUTF8(s));
_projectFile.setting.setString("name", toUTF8(s));
}
/// name
@ -501,7 +502,7 @@ class Project : WorkspaceItem {
/// name
override @property void description(dstring s) {
super.description(s);
_projectFile.setString("description", toUTF8(s));
_projectFile.setting.setString("description", toUTF8(s));
}
/// returns project's own source paths
@ -576,12 +577,12 @@ class Project : WorkspaceItem {
if (!isExecutable)
return null;
string exename = toUTF8(name);
exename = _projectFile.getString("targetName", exename);
exename = _projectFile.setting.getString("targetName", exename);
// TODO: use targetName
version (Windows) {
exename = exename ~ ".exe";
}
string targetPath = _projectFile.getString("targetPath", null);
string targetPath = _projectFile.setting.getString("targetPath", null);
string exePath;
if (targetPath.length)
exePath = buildNormalizedPath(_filename.dirName, targetPath, exename); // int $targetPath directory
@ -607,8 +608,8 @@ class Project : WorkspaceItem {
return settings.runInExternalConsole;
}
ProjectFolder findItems(string[] srcPaths) {
auto folder = new ProjectFolder(_filename);
private ProjectFolder findItems(string[] srcPaths) {
auto folder = new ProjectFolder(_filename.dirName);
folder.project = this;
foreach(customPath; srcPaths) {
string path = relativeToAbsolutePath(customPath);
@ -685,10 +686,10 @@ class Project : WorkspaceItem {
protected string[] findSourcePaths() {
string[] res;
res.assumeSafeAppend;
string[] srcPaths = _projectFile.getStringArray("sourcePaths");
string[] srcPaths = _projectFile.setting.getStringArray("sourcePaths");
foreach(s; srcPaths)
addRelativePathIfExists(res, s);
Setting configs = _projectFile.objectByPath("configurations");
Setting configs = _projectFile.setting.objectByPath("configurations");
if (configs) {
for (int i = 0; i < configs.length; i++) {
Setting s = configs[i];
@ -710,7 +711,7 @@ class Project : WorkspaceItem {
void processSubpackages() {
import dlangui.core.files;
_subPackages.length = 0;
Setting subPackages = _projectFile.settingByPath("subPackages", SettingType.ARRAY, false);
Setting subPackages = _projectFile.setting.settingByPath("subPackages", SettingType.ARRAY, false);
if (subPackages) {
string p = _projectFile.filename.dirName;
for(int i = 0; i < subPackages.length; i++) {
@ -761,7 +762,7 @@ class Project : WorkspaceItem {
//
_mainSourceFile = null;
try {
_name = toUTF32(_projectFile.getString("name"));
_name = toUTF32(_projectFile.setting.getString("name"));
_originalName = _name;
if (_baseProjectName) {
_name = _baseProjectName ~ ":" ~ _name;
@ -770,7 +771,7 @@ class Project : WorkspaceItem {
_name ~= "-"d;
_name ~= toUTF32(_dependencyVersion.startsWith("~") ? _dependencyVersion[1..$] : _dependencyVersion);
}
_description = toUTF32(_projectFile.getString("description"));
_description = toUTF32(_projectFile.setting.getString("description"));
Log.d(" project name: ", _name);
Log.d(" project description: ", _description);
@ -786,7 +787,7 @@ class Project : WorkspaceItem {
if (!_isDependency)
loadSelections();
_configurations = ProjectConfiguration.load(_projectFile);
_configurations = ProjectConfiguration.load(_projectFile.setting);
Log.i("Project configurations: ", _configurations);
@ -842,7 +843,7 @@ class Project : WorkspaceItem {
_dependencies = newdeps;
return false;
}
Setting versions = selectionsFile.objectByPath("versions");
Setting versions = selectionsFile.setting.objectByPath("versions");
if (!versions.isObject) {
_dependencies = newdeps;
return false;
@ -934,19 +935,19 @@ class DubPackageFinder {
bool isValidProjectName(in string s) pure {
if (s.empty)
return false;
return reduce!q{ a && (b == '_' || b == '-' || std.ascii.isAlphaNum(b)) }(true, s);
return reduce!((a, b) => a && (b == '_' || b == '-' || isAlphaNum(b)))(true, s);
}
bool isValidModuleName(in string s) pure {
if (s.empty)
return false;
return reduce!q{ a && (b == '_' || std.ascii.isAlphaNum(b)) }(true, s);
return reduce!((a, b) => a && (b == '_' || isAlphaNum(b)))(true, s);
}
bool isValidFileName(in string s) pure {
if (s.empty)
return false;
return reduce!q{ a && (b == '_' || b == '.' || b == '-' || std.ascii.isAlphaNum(b)) }(true, s);
return reduce!((a, b) => a && (b == '_' || b == '.' || b == '-' || isAlphaNum(b)))(true, s);
}
unittest {

View File

@ -74,7 +74,7 @@ class Workspace : WorkspaceItem {
}
@property Setting includePath(){
Setting res = _workspaceFile.objectByPath("includePath", true);
Setting res = _workspaceFile.setting.objectByPath("includePath", true);
return res;
}
@ -314,11 +314,11 @@ class Workspace : WorkspaceItem {
if (df && !_description.empty) // cut off last delimiter
_description = _description[ 0 .. $ - 3 ];
}
_workspaceFile.setString("name", toUTF8(_name));
_workspaceFile.setString("description", toUTF8(_description));
_workspaceFile.setting.setString("name", toUTF8(_name));
_workspaceFile.setting.setString("description", toUTF8(_description));
Log.d("workspace name: ", _name);
Log.d("workspace description: ", _description);
Setting projects = _workspaceFile.objectByPath("projects", true);
Setting projects = _workspaceFile.setting.objectByPath("projects", true);
projects.clear(SettingType.OBJECT);
foreach (Project p; _projects) {
if (p.isDependency)
@ -346,8 +346,8 @@ class Workspace : WorkspaceItem {
return false;
}
_settings.load(filename ~ WORKSPACE_SETTINGS_EXTENSION);
_name = toUTF32(_workspaceFile["name"].str);
_description = toUTF32(_workspaceFile["description"].str);
_name = toUTF32(_workspaceFile.setting["name"].str);
_description = toUTF32(_workspaceFile.setting["description"].str);
Log.d("workspace name: ", _name);
Log.d("workspace description: ", _description);
if (_name.empty()) {
@ -355,7 +355,7 @@ class Workspace : WorkspaceItem {
return false;
}
auto originalStartupProjectName = _settings.startupProjectName;
Setting projects = _workspaceFile.objectByPath("projects", true);
Setting projects = _workspaceFile.setting.objectByPath("projects", true);
foreach(string key, Setting value; projects) {
string path = value.str;
Log.d("project: ", key, " path:", path);

View File

@ -1 +1 @@
v0.8.10
v0.8.17

View File

@ -4,3 +4,4 @@ res/i18n/en.ini
res/i18n/ru.ini
res/i18n/es.ini
res/i18n/cs.ini
res/i18n/de.ini

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -80,6 +80,7 @@ MENU_VIEW_LANGUAGE_EN=English
MENU_VIEW_LANGUAGE_RU=Русский
MENU_VIEW_LANGUAGE_CS=Čeština
MENU_VIEW_LANGUAGE_ES=Spanish
MENU_VIEW_LANGUAGE_DE=Deutsch
MENU_VIEW_THEME=&Téma
MENU_VIEW_THEME_DEFAULT=&Default
MENU_VIEW_THEME_CUSTOM1=&Custom 1

268
views/res/i18n/de.ini Normal file
View File

@ -0,0 +1,268 @@
ABOUT=Über DlangIDE
HOME=DlangIDE Home
DESCRIPTION=D-Sprach-IDE geschrieben in D
COPYRIGHT=(c) Vadim Lopatin 2017
START_WITH=Starten mit:
RECENT=Kürzlich:
NO_RECENT=Keine kürzlich verwendete Einträge
USEFUL_LINKS=Nützliche Links:
D_LANG=D Programmiersprache
DUB_REP=DUB Repository
DLANG_DOWNLOADS=D-Compiler downloaden
DLANG_UI=DLangUI auf GitHub
DLANG_IDE=DLangIDE auf GitHub
DLANG_IDE_HELP=DLangIDE Onlinedokumentation
DLANG_TOUR=DLang Tour
DLANG_VIBED=Vibe-D
DLANG_FORUM=Dlang Forum
DLANG_IDE_DONATE=DlangIDE unterstützen
DLANG_IDE_DONATE_PAYPAL=Spenden über PayPal
EXIT=Beenden
PROFILER_WINDOW=Profiler
ALL_FILES=Alle Dateien
SOURCE_FILES=Quelldateien
WORKSPACE_AND_PROJECT_FILES=Workspace- und Projektdateien
IDE_FILES=DlangIDE Dateien
PROFILER_LOG_FILES=DMD Profiler Logs
EDITOR_CONTENT=Editorinhalte
LOCATION=Position
NAME=Name
MENU_FILE=Datei
MENU_FILE_NEW=Erstelle
MENU_FILE_NEW_SOURCE_FILE=Neue Datei
MENU_FILE_NEW_PROJECT=Neues Projekt
MENU_FILE_NEW_WORKSPACE=Neue Workspace
MENU_FILE_OPEN=Öffne Datei...
MENU_FILE_OPEN_WORKSPACE=Öffne Projekt oder Workspace...
MENU_FILE_OPEN_RECENT=Öffne kürzlich
MENU_FILE_SAVE=&Speichern
MENU_FILE_SAVE_AS=&Speichern unter...
MENU_FILE_SAVE_ALL=Alles &speichern
MENU_FILE_WORKSPACE_CLOSE=Schließe Workspace
MENU_FILE_EXIT=Beende
MENU_EDIT=&Editieren
MENU_EDIT_COPY=Kopieren
MENU_EDIT_PASTE=Einfügen
MENU_EDIT_CUT=Ausschneiden
MENU_EDIT_UNDO=Rückgängig
MENU_EDIT_REDO=Wiederherstellen
MENU_EDIT_INDENT=Block einrücken
MENU_EDIT_UNINDENT=Block ausrücken
MENU_EDIT_TOGGLE_LINE_COMMENT=Zeilenkommentare umschalten
MENU_EDIT_TOGGLE_BLOCK_COMMENT=Blockkommentare umschalten
MENU_EDIT_ADVANCED=Erweitert...
MENU_EDIT_PREFERENCES=Einstellungen
MENU_VIEW=Ansicht
MENU_VIEW_SHOW_WHITESPACE_MARKS=Zeige Leerzeichenmarkierungen an
MENU_VIEW_SHOW_TAB_POSITIONS=Tabpositionsmarkierungen
MENU_VIEW_SHOW_TOOLBAR=Zeige Toolbar an
MENU_VIEW_SHOW_STATUSBAR=Zeige Statusbar an
MENU_PROJECT=&Projekt
MENU_PROJECT_CONFIGURATIONS=Projekt konfigurieren
MENU_PROJECT_SET_AS_STARTUP=Als Startprojekt setzen
MENU_PROJECT_SETTINGS=Projekteinstellungen
MENU_PROJECT_REFRESH=Workspace-Einträge aktualisieren
MENU_PROJECT_UPDATE_DEPENDENCIES=Abhänigkeiten aktualisieren
MENU_NAVIGATE=&Navigation
GO_TO_DEFINITION=Gehe zu Definition
SHOW_COMPLETIONS=Autovervollständigung anzeigen
SHOW_DOC_COMMENTS=Dokumentation anzeigen
SHOW_PAREN_COMPLETION=Autrufvorschläge
GO_TO_LINE=Gehe zu Zeile
FIND_IN_FILES=Finde in Dateien...
MENU_BUILD_CONFIGURATIONS=Build-Konfigurationen
MENU_BUILD_CONFIGURATION=Build-Konfiguration
MENU_BUILD=&Build
MENU_BUILD_WORKSPACE_BUILD=Baue Workspace
MENU_BUILD_WORKSPACE_REBUILD=Baue erneut Workspace
MENU_BUILD_WORKSPACE_CLEAN=Säubere Workspace
MENU_BUILD_PROJECT_BUILD=Baue Projekt
MENU_BUILD_PROJECT_REBUILD=Baue erneut Projekt
MENU_BUILD_PROJECT_CLEAN=Säubere Projekt
MENU_BUILD_RUN_WITH_RDMD=Starte mit rdmd
MENU_BUILD_CONFIGURATION=Build-Type
MENU_PROJECT_CONFIGURATION=Projektkonfiguration
MENU_DEBUG=&Debug
MENU_DEBUG_START_DEBUGGING=Starte debuggen
MENU_DEBUG_START_NO_DEBUGGING=Starte ohne debuggen
MENU_DEBUG_CONTINUE=Debuggen fortfahren
MENU_DEBUG_STOP=Stop
MENU_DEBUG_PAUSE=Pause
MENU_DEBUG_RESTART=Neustart
MENU_DEBUG_STEP_INTO=Springe hinein
MENU_DEBUG_STEP_OVER=Springe hinweg
MENU_DEBUG_STEP_OUT=Springe heraus
MENU_DEBUG_BREAKPOINT_TOGGLE=Haltepunkt umschalten
MENU_DEBUG_BREAKPOINT_ENABLE=Aktiviere Haltepunkt
MENU_DEBUG_BREAKPOINT_DISABLE=Deaktiviere Haltepunkt
MENU_WINDOW=Fenster
MENU_WINDOW_PREFERENCES=Einstellungen
MENU_WINDOW_CLOSE_DOCUMENT=Schließe Dokument
MENU_WINDOW_CLOSE_ALL_DOCUMENTS=Schließe alle Dokumente
MENU_WINDOW_SHOW_HOME_SCREEN=Zeige Homescreen
MENU_WINDOW_SHOW_WORKSPACE_EXPLORER=Workspace-Explorer
MENU_WINDOW_SHOW_LOG_WINDOW=Log-Fenster
MENU_HELP=&Hilfe
MENU_HELP_VIEW_HELP=Online Hilfe
MENU_HELP_ABOUT=Über
MENU_HELP_DONATE=Spenden über PayPal
MENU_VIEW=Anzeige
MENU_VIEW_LANGUAGE=Oberflächensprache
MENU_VIEW_LANGUAGE_EN=English
MENU_VIEW_LANGUAGE_RU=Русский
MENU_VIEW_LANGUAGE_CS=Čeština
MENU_VIEW_LANGUAGE_ES=Spanish
MENU_VIEW_LANGUAGE_DE=Deutsch
MENU_VIEW_THEME=&Theme
MENU_VIEW_THEME_DEFAULT=Standart
MENU_VIEW_THEME_CUSTOM1=&Custom 1
MENU_TOOLS=Tools
OPEN_DMD_TRACE_LOG=Öffne DMD Profiler-Log
TAB_LONG_LIST=Lange Liste
TAB_BUTTONS=Knopf
TAB_ANIMATION=Animation
TAB_TABLE_LAYOUT=Tabellenlayout
TAB_EDITORS=Editoren
MENU_PROJECT_FOLDER_ADD_ITEM=Hinzufügen...
MENU_PROJECT_FOLDER_OPEN_ITEM=Öffnen
MENU_PROJECT_FOLDER_REMOVE_ITEM=Umbenennen
MENU_PROJECT_FOLDER_RENAME_ITEM=Umbenennen...
MENU_PROJECT_FOLDER_REFRESH=Aktualisieren
MENU_PROJECT_REVEAL_IN_EXPLORER=Zeige im Dateimanager an
MENU_PROJECT_FOLDER_EXPAND_ALL=Alles ausklappen
MENU_PROJECT_FOLDER_COLLAPSE_ALL=Alles einklappen
HEADER_SETTINGS=DlangIDE Einstellungen
HEADER_OPEN_WORKSPACE_OR_PROJECT=Öffne Workspace oder Projekt
HEADER_OPEN_TEXT_FILE=Öffne Textdatei
HEADER_OPEN_DMD_PROFILER_LOG=Öffne DMD Profiler Logdatei
HEADER_CLOSE_FILE=Schließe Datei
HEADER_CLOSE_TAB=Schließe Tab
HEADER_PROJECT_SETTINGS=Projekteinstellungen
HEADER_REMOVE_FILE=Entferne Datei
HEADER_SAVE_FILE_AS=Speichere Datei unter
OPTION_ADD_TO_CURRENT_WORKSPACE=Füge zur momentaner Wokrspace hinzu
OPTION_ARCHITECTURE=Architektur
OPTION_AUTO_OPEN_LAST_PROJECT=Öffne automatisch das letzte Projekt
OPTION_BUILD=Build
OPTION_COMMAND_LINE=Kommandozeilenargumente
OPTION_COMMON=Standard
OPTION_CREATE_NEW_SOLUTION=Erstelle neue Ansicht
OPTION_CREATE_NEW_WORKSPACE=Erstelle neue Workspace
OPTION_CREATE_SUBDIRECTORY_FOR_PROJECT=Erstelle einen Unterordner für das Projekt
OPTION_CREATE_SUBDIRECTORY_FOR_WORKSPACE=Erstelle einen Unterordner für die Workspace
OPTION_DARK=Dunkel
OPTION_DEBUGGER=Debugger
OPTION_DEBUGGER_EXECUTABLE=Debugger-Anwendung
OPTION_DEFAULT=Standard
OPTION_DIRECTORY_LAYOUT=Ordneransicht
OPTION_DMD_EXECUTABLE=DMD-Anwendung
OPTION_DUB_ADDITIONAL_PARAMS=DUB zusätzliche Parameter
OPTION_DUB_EXECUTABLE=DUB-Anwendung
OPTION_EDITORS=Editoren
OPTION_INTERFACE=Interface
OPTION_FILE_PATH=Dateipfad
OPTION_FONT_ANTIALIASING=Minimale Schriftgröße für Antialiasing
OPTION_FONT_ANTIALIASING_ALWAYS_OFF=Immer AUS
OPTION_FONT_ANTIALIASING_ALWAYS_ON=Immer AN
OPTION_FONT_HINTING=Schrift-Hinting
OPTION_FONT_HINTING_DISABLED=Abgeschaltet
OPTION_FONT_HINTING_FORCE=Erzwinge automatische Hints
OPTION_FONT_HINTING_NORMAL=Normal
OPTION_FONT_HINTING_LIGHT=LIGHT
OPTION_FONT_FACE=Schriftart
OPTION_FONT_SIZE=Schriftgröße
OPTION_FONT_GAMMA=Schrift-Gamma
OPTION_SCREEN_DPI_OVERRIDE=Überschreibe Bildschirm DPI
OPTION_SCREEN_DPI_OVERRIDE_NONE=Standard Bildschirm DPI
OPTION_GDC_EXECUTABLE=GDC-Anwendung
OPTION_LANGUAGE=Sprache
OPTION_LDC2_EXECUTABLE=LDC2-Anwendung
OPTION_LDMD2_EXECUTABLE=LDMD2-Anwendung
OPTION_MODULE_NAME=Modulname
OPTION_NEW_PROJECT=Neues Projekt
OPTION_NEW_SOURCE_FILE=Neue Quelldatei
OPTION_NEW_WORKSPACE=Neue Workspace
OPTION_PROJECT_NAME=Projektname
OPTION_PROJECT_TEMPLATE=Projektvorlage
OPTION_RDMD_ADDITIONAL_PARAMS=rdmd zusätzliche Parameter
OPTION_RDMD_EXECUTABLE=rdmd-Anwendung
OPTION_RUN_IN_EXTERNAL_CONSOLE=Starte in externen Konsole
OPTION_RUN_DEBUG=Starte und debugge
OPTION_SHOW_SPACES=Zeige Leerzeichenmarkierungen an
OPTION_SHOW_TABS=Zeige Tabpositionsmarkierungen an
OPTION_SMART_INDENTS=Schlaues Einrücken
OPTION_SMART_INDENTS_PASTE=Schlaues Einrücken nach Einfügen
OPTION_TAB=Tabgröße
OPTION_TEMPLATE_DESCR=Vorlagenbeschreibung
OPTION_TEXT_EDITORS=Texteditor
OPTION_TERMINAL=Terminal
OPTION_TERMINAL_EXECUTABLE=Terminal-Anwendung
OPTION_THEME=Theme
OPTION_TOOLCHAIN=Toolchain
OPTION_TOOLCHAINS=Toolchains
OPTION_VERBOSE=Verbose
OPTION_WORKING_DIR=Arbeitsverzeichnis
OPTION_WORKSPACE_NAME=Workspace-Name
OPTION_USE_SPACES=Nutze Leerzeichen für Tabs
ERROR=Fehler
ERROR_CANNOT_CREATE_PROJECT=Projekte konnte nicht erstellt werden
ERROR_CANNOT_DEBUG_PROJECT=Projekt konnte nicht gedebuggt werden
ERROR_CANNOT_FIND_EXEC=Ausführbare Datei nicht gefunden
ERROR_CANNOT_RUN_PROJECT=Projekt konnte nicht gestartet werden
ERROR_FAILED_CREATE_PROJECT=Projekt konnte nicht erstllt werden
ERROR_STARTUP_PROJECT_ABSENT=Kein Startprojekt angegeben
ERROR_INVALID_NUMBER=Unzulässige Nummer
ERROR_INVALID_PARAMETERS=Ungültiger Parameter
ERROR_INVALID_WORKSPACE_FILE=Ungültige Workspace-Datei
ERROR_INVALID_WS_OR_PROJECT_FILE=Diese Datei ist keine gültige Workspace-/Projektdatei
ERROR_NO_DEBUGGER=Kein Debugger in den Einstellungen angegeben
ERROR_NO_SUCH_LINE=Keine solche Zeile
ERROR_OPEN_FILE=Datei konnte nicht geöffnet werden
ERROR_OPEN_PROJECT=Projekt konnte nicht geöffnet werden
ERROR_OPEN_WORKSPACE=Workspace konnte nicht geöffnet werden
ERROR_OPENING_FILE=Datei konnte nicht geöffnet werden
ERROR_OPENING_PROJECT=Ein Fehler trat auf beim öffnen des Projekts
ERROR_OPENING_WORKSPACE=Ein Fehler trat auf beim öffnen der Workspace
ERROR_FAILED_TO_PARSE_TRACE_LOG_FILE=Fehler beim Verarbeiten vom Trace-Log
MSG_FILE_CONTENT_CHANGED=Dateiinhalt hat sich verändert.
MSG_TAB_CONTENT_CHANGED=Tabinhalt hat sich verändert
MSG_OK_BUTTON=OK-Knopf gedrückt
MSG_OPEN_PROJECT=Öffne Projekt
MSG_PROJECT_ALREADY_OPENED=Projekt ist schon in der Workspace
MSG_SELECT_DIR=Ordner auswählen
MSG_STARTING=Starte
MSG_STARTING_DEBUGGER=Starte Debugger für
MSG_TRY_OPEN_PROJECT=Versuche Projekt zu öffnen von
DEBUGGING=debugge...
RUNNING=läuft...
QUESTION_CREATE_DIR=Der Zielpfad existiert nicht. Soll der Ordner angelegt werden?
QUESTION_NEW_WORKSPACE=Soll ein neuer Workspace anglegt werden oder der momentane verwendet werden?
QUESTION_REMOVE_FILE=Soll die Datei gelöscht werden
BUILD_OP_DESCRIPTION_BUILD=Baue Projekt {projectName}...
BUILD_OP_DESCRIPTION_CLEAN=Säubere Projekt {projectName}...
BUILD_OP_DESCRIPTION_REBUILD=Baue erneut Projekt {projectName}...
BUILD_OP_DESCRIPTION_RUN=Starte Projekt {projectName}...
BUILD_OP_DESCRIPTION_UPGRADE=Aktualisiere Pakte für das Projekt {projectName}...

View File

@ -34,6 +34,7 @@ NAME=Name
MENU_FILE=&File
MENU_FILE_NEW=&Create
MENU_FILE_NEW_SOURCE_FILE=New file
MENU_FILE_NEW_DIRECTORY=New directory
MENU_FILE_NEW_PROJECT=New project
MENU_FILE_NEW_WORKSPACE=New workspace
MENU_FILE_OPEN=&Open file...
@ -77,6 +78,8 @@ SHOW_COMPLETIONS=Get autocompletions
SHOW_DOC_COMMENTS=Show documentation
SHOW_PAREN_COMPLETION=Call hints
GO_TO_LINE=Go to line
GO_TO_PREV_POSITION=Go to previous position
GO_TO_NEXT_POSITION=Go to next position
FIND_IN_FILES=Find in files...
@ -126,6 +129,7 @@ MENU_VIEW_LANGUAGE_EN=English
MENU_VIEW_LANGUAGE_RU=Русский
MENU_VIEW_LANGUAGE_CS=Čeština
MENU_VIEW_LANGUAGE_ES=Spanish
MENU_VIEW_LANGUAGE_DE=Deutsch
MENU_VIEW_THEME=&Theme
MENU_VIEW_THEME_DEFAULT=&Default
MENU_VIEW_THEME_CUSTOM1=&Custom 1
@ -196,6 +200,7 @@ OPTION_GDC_EXECUTABLE=GDC executable
OPTION_LANGUAGE=Language
OPTION_LDC2_EXECUTABLE=LDC2 executable
OPTION_LDMD2_EXECUTABLE=LDMD2 executable
OPTION_MAKE_PACKAGE=Create package.d
OPTION_MODULE_NAME=Module name
OPTION_NEW_PROJECT=New project
OPTION_NEW_SOURCE_FILE=New source file
@ -222,6 +227,7 @@ OPTION_VERBOSE=Verbose
OPTION_WORKING_DIR=Working directory
OPTION_WORKSPACE_NAME=Workspace name
OPTION_USE_SPACES=Use spaces for tabs
OPTION_AUTO_AUTOCOMPLETE=Automatically suggest auto completion
ERROR=Error
ERROR_CANNOT_CREATE_PROJECT=Cannot create project

View File

@ -49,6 +49,7 @@ MENU_VIEW_LANGUAGE_ES=Spanish
MENU_VIEW_LANGUAGE_EN=English
MENU_VIEW_LANGUAGE_RU=Русский
MENU_VIEW_LANGUAGE_CS=Čeština
MENU_VIEW_LANGUAGE_DE=Deutsch
MENU_VIEW_THEME=&Tema
MENU_VIEW_THEME_DEFAULT=&Por Defecto
MENU_VIEW_THEME_CUSTOM1=&Personalizado 1

View File

@ -125,6 +125,7 @@ MENU_VIEW_LANGUAGE_ES=Spanish
MENU_VIEW_LANGUAGE_EN=English
MENU_VIEW_LANGUAGE_RU=Русский
MENU_VIEW_LANGUAGE_CS=Čeština
MENU_VIEW_LANGUAGE_DE=Deutsch
MENU_VIEW_THEME=&Тема
MENU_VIEW_THEME_DEFAULT=Стандартная
MENU_VIEW_THEME_CUSTOM1=Пример 1
@ -220,6 +221,7 @@ OPTION_VERBOSE=Показать подробности
OPTION_WORKING_DIR=Рабочий каталог
OPTION_WORKSPACE_NAME=Имя рабочего пространства
OPTION_USE_SPACES=Использовать пробелы вместо табуляции
OPTION_AUTO_AUTOCOMPLETE=Автоматически предлагать дополнение кода
ERROR=Ошибка
ERROR_CANNOT_CREATE_PROJECT=Не могу создать проект

Binary file not shown.

After

Width:  |  Height:  |  Size: 920 B

View File

@ -4,8 +4,15 @@ res/i18n/en.ini
res/i18n/ru.ini
res/i18n/es.ini
res/i18n/cs.ini
res/i18n/de.ini
res/hdpi/hdpi_configure.png
res/hdpi/hdpi_debug-run.png
res/hdpi/hdpi_debug-pause.png
res/hdpi/hdpi_debug-stop.png
res/hdpi/hdpi_debug-restart.png
res/hdpi/hdpi_debug-step-into.png
res/hdpi/hdpi_debug-step-out.png
res/hdpi/hdpi_debug-step-over.png
res/hdpi/hdpi_document-close.png
res/hdpi/hdpi_document-open-recent.png
res/hdpi/hdpi_document-open.png