diff --git a/src/dlangide/ui/frame.d b/src/dlangide/ui/frame.d index 262cf4b..0ddc74e 100644 --- a/src/dlangide/ui/frame.d +++ b/src/dlangide/ui/frame.d @@ -123,6 +123,39 @@ class IDEFrame : AppFrame { } } + /// close tab w/o confirmation + void closeTab(string tabId) { + _wsPanel.selectItem(null); + _tabs.removeTab(tabId); + } + + protected void onTabClose(string tabId) { + Log.d("onTabClose ", tabId); + int index = _tabs.tabIndex(tabId); + if (index >= 0) { + DSourceEdit d = cast(DSourceEdit)_tabs.tabBody(tabId); + if (d && d.content.modified) { + // tab content is modified - ask for confirmation + window.showMessageBox(UIString("Close tab"d), UIString("Content of "d ~ toUTF32(baseName(id)) ~ " file has been changed."d), + [ACTION_SAVE, ACTION_DISCARD_CHANGES, ACTION_CANCEL], + 0, delegate(const Action result) { + if (result == StandardAction.Save) { + // save and close + d.save(); + closeTab(tabId); + } else if (result == StandardAction.DiscardChanges) { + // close, don't save + closeTab(tabId); + } + // else ignore + return true; + }); + } else { + closeTab(tabId); + } + } + } + /// create app body widget override protected Widget createBody() { _dockHost = new DockHost(); @@ -134,7 +167,8 @@ class IDEFrame : AppFrame { _tabs = new TabWidget("TABS"); _tabs.setStyles(STYLE_DOCK_HOST_BODY, STYLE_TAB_UP_DARK, STYLE_TAB_UP_BUTTON_DARK, STYLE_TAB_UP_BUTTON_DARK_TEXT); _tabs.onTabChangedListener = &onTabChanged; - + _tabs.onTabCloseListener = &onTabClose; + _dockHost.bodyWidget = _tabs; //============================================================= diff --git a/src/dlangide/ui/wspanel.d b/src/dlangide/ui/wspanel.d index 0dbc6ed..53df648 100644 --- a/src/dlangide/ui/wspanel.d +++ b/src/dlangide/ui/wspanel.d @@ -31,15 +31,22 @@ class WorkspacePanel : DockWindow { } bool selectItem(ProjectItem projectItem) { - TreeItem item = _tree.findItemById(projectItem.filename); - if (item) { - _tree.selectItem(item); + if (projectItem) { + TreeItem item = _tree.findItemById(projectItem.filename); + if (item) { + _tree.selectItem(item); + return true; + } + } else { + _tree.clearSelection(); return true; } return false; } void onTreeItemSelected(TreeItems source, TreeItem selectedItem, bool activated) { + if (!selectedItem) + return; if (selectedItem.intParam == ProjectItemType.SourceFile) { // file selected if (sourceFileSelectionListener.assigned) { diff --git a/workspaces/sample1/sampleproject1/source/main.d b/workspaces/sample1/sampleproject1/source/main.d index f75b123..d09973e 100644 --- a/workspaces/sample1/sampleproject1/source/main.d +++ b/workspaces/sample1/sampleproject1/source/main.d @@ -1,7 +1,6 @@ void main() { -/// }