filerx 4 lat temu
rodzic
commit
9d34e7e8e8
75 zmienionych plików z 870 dodań i 173 usunięć
  1. 38 0
      build.gradle
  2. 1 0
      gradle.properties
  3. 5 0
      gradle/wrapper/gradle-wrapper.properties
  4. 185 0
      gradlew
  5. 89 0
      gradlew.bat
  6. 10 0
      settings.gradle
  7. 0 0
      src/main/kotlin/org/tboox/xmake/actions/BuildAction.kt
  8. 0 0
      src/main/kotlin/org/tboox/xmake/actions/CleanAction.kt
  9. 0 0
      src/main/kotlin/org/tboox/xmake/actions/CleanConfigurationAction.kt
  10. 0 0
      src/main/kotlin/org/tboox/xmake/actions/QuickStartAction.kt
  11. 0 0
      src/main/kotlin/org/tboox/xmake/actions/RebuildAction.kt
  12. 0 0
      src/main/kotlin/org/tboox/xmake/actions/RunAction.kt
  13. 0 0
      src/main/kotlin/org/tboox/xmake/icons/XMakeIconProvider.kt
  14. 22 0
      src/main/kotlin/org/tboox/xmake/icons/XMakeIcons.kt
  15. 6 0
      src/main/kotlin/org/tboox/xmake/project/XMakeConfigData.kt
  16. 69 0
      src/main/kotlin/org/tboox/xmake/project/XMakeDirectoryProjectGenerator.kt
  17. 64 0
      src/main/kotlin/org/tboox/xmake/project/XMakeModuleBuilder.kt
  18. 2 2
      src/main/kotlin/org/tboox/xmake/project/XMakeModuleConfigurationEditorProvider.kt
  19. 0 0
      src/main/kotlin/org/tboox/xmake/project/XMakeModuleType.kt
  20. 88 0
      src/main/kotlin/org/tboox/xmake/project/XMakeNewProjectPanel.kt
  21. 0 0
      src/main/kotlin/org/tboox/xmake/project/XMakeProjectConfigurable.kt
  22. 26 0
      src/main/kotlin/org/tboox/xmake/project/XMakeProjectGeneratorPeer.kt
  23. 7 0
      src/main/kotlin/org/tboox/xmake/project/XMakeProjectSettingsStep.kt
  24. 54 0
      src/main/kotlin/org/tboox/xmake/project/XMakeSdkSettingsStep.kt
  25. 0 0
      src/main/kotlin/org/tboox/xmake/project/XMakeSdkType.kt
  26. 3 3
      src/main/kotlin/org/tboox/xmake/project/XMakeToolWindowFactory.kt
  27. 7 4
      src/main/kotlin/org/tboox/xmake/project/XMakeToolWindowOutputPanel.kt
  28. 0 0
      src/main/kotlin/org/tboox/xmake/project/XMakeToolWindowProblemPanel.kt
  29. 19 13
      src/main/kotlin/org/tboox/xmake/run/XMakeProjectTasksRunner.kt
  30. 12 8
      src/main/kotlin/org/tboox/xmake/run/XMakeRunConfiguration.kt
  31. 0 0
      src/main/kotlin/org/tboox/xmake/run/XMakeRunConfigurationEditor.kt
  32. 0 0
      src/main/kotlin/org/tboox/xmake/run/XMakeRunConfigurationProducer.kt
  33. 16 15
      src/main/kotlin/org/tboox/xmake/run/XMakeRunConfigurationType.kt
  34. 0 0
      src/main/kotlin/org/tboox/xmake/run/XMakeRunner.kt
  35. 0 0
      src/main/kotlin/org/tboox/xmake/shared/XMakeConfiguration.kt
  36. 0 0
      src/main/kotlin/org/tboox/xmake/shared/XMakeProblem.kt
  37. 10 9
      src/main/kotlin/org/tboox/xmake/utils/ConsoleProcessHandler.kt
  38. 1 1
      src/main/kotlin/org/tboox/xmake/utils/SystemUtils.kt
  39. 4 0
      src/main/resources/META-INF/clion-only.xml
  40. 2 0
      src/main/resources/META-INF/idea-only.xml
  41. 130 0
      src/main/resources/META-INF/plugin.xml
  42. BIN
      src/main/resources/icons/build.png
  43. BIN
      src/main/resources/icons/[email protected]
  44. BIN
      src/main/resources/icons/build@2x_dark.png
  45. BIN
      src/main/resources/icons/build_dark.png
  46. BIN
      src/main/resources/icons/clean.png
  47. BIN
      src/main/resources/icons/[email protected]
  48. BIN
      src/main/resources/icons/cleanconf.png
  49. BIN
      src/main/resources/icons/[email protected]
  50. BIN
      src/main/resources/icons/debug.png
  51. BIN
      src/main/resources/icons/[email protected]
  52. BIN
      src/main/resources/icons/debug@2x_dark.png
  53. BIN
      src/main/resources/icons/debug_dark.png
  54. BIN
      src/main/resources/icons/error.png
  55. BIN
      src/main/resources/icons/[email protected]
  56. BIN
      src/main/resources/icons/quickstart.png
  57. BIN
      src/main/resources/icons/[email protected]
  58. BIN
      src/main/resources/icons/rebuild.png
  59. BIN
      src/main/resources/icons/[email protected]
  60. BIN
      src/main/resources/icons/rebuild@2x_dark.png
  61. BIN
      src/main/resources/icons/rebuild_dark.png
  62. BIN
      src/main/resources/icons/run.png
  63. BIN
      src/main/resources/icons/[email protected]
  64. BIN
      src/main/resources/icons/settings.png
  65. BIN
      src/main/resources/icons/[email protected]
  66. BIN
      src/main/resources/icons/settings@2x_dark.png
  67. BIN
      src/main/resources/icons/settings_dark.png
  68. BIN
      src/main/resources/icons/warning.png
  69. BIN
      src/main/resources/icons/[email protected]
  70. BIN
      src/main/resources/icons/xmake.png
  71. BIN
      src/main/resources/icons/[email protected]
  72. BIN
      src/main/resources/icons/xmake_13x13.png
  73. 0 18
      src/org/tboox/xmake/icons/XMakeIcons.kt
  74. 0 76
      src/org/tboox/xmake/project/XMakeModuleBuilder.kt
  75. 0 24
      src/org/tboox/xmake/project/XMakeSdkSettingsStep.kt

+ 38 - 0
build.gradle

@@ -0,0 +1,38 @@
+plugins {
+    id 'java'
+    id 'org.jetbrains.intellij' version '0.7.3'
+    id 'org.jetbrains.kotlin.jvm' version '1.5.10'
+}
+apply plugin: 'org.jetbrains.intellij'
+apply plugin: 'idea'
+
+group 'org.example'
+version '1.0-SNAPSHOT'
+
+repositories {
+    mavenCentral()
+    maven {
+        url "https://oss.sonatype.org/content/repositories/snapshots/"
+    }
+}
+
+dependencies {
+    implementation "org.jetbrains.kotlin:kotlin-stdlib"
+    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
+    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
+}
+
+// See https://github.com/JetBrains/gradle-intellij-plugin/
+intellij {
+
+//    version = 'LATEST-EAP-SNAPSHOT'
+    ///////clion 配置////////
+        type 'CL'
+        version = 'CL-2021.1.2'
+        downloadSources false
+    plugins = ["com.intellij.cidr.base", "com.intellij.clion"]
+}
+
+test {
+    useJUnitPlatform()
+}

+ 1 - 0
gradle.properties

@@ -0,0 +1 @@
+kotlin.code.style=official

+ 5 - 0
gradle/wrapper/gradle-wrapper.properties

@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists

+ 185 - 0
gradlew

@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+    echo "$*"
+}
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=`expr $i + 1`
+    done
+    case $i in
+        0) set -- ;;
+        1) set -- "$args0" ;;
+        2) set -- "$args0" "$args1" ;;
+        3) set -- "$args0" "$args1" "$args2" ;;
+        4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"

+ 89 - 0
gradlew.bat

@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem      https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega

+ 10 - 0
settings.gradle

@@ -0,0 +1,10 @@
+
+pluginManagement {
+    repositories {
+        maven {
+            url 'https://oss.sonatype.org/content/repositories/snapshots/'
+        }
+        gradlePluginPortal()
+    }
+}
+rootProject.name = 'xmake-idea'

+ 0 - 0
src/org/tboox/xmake/actions/BuildAction.kt → src/main/kotlin/org/tboox/xmake/actions/BuildAction.kt


+ 0 - 0
src/org/tboox/xmake/actions/CleanAction.kt → src/main/kotlin/org/tboox/xmake/actions/CleanAction.kt


+ 0 - 0
src/org/tboox/xmake/actions/CleanConfigurationAction.kt → src/main/kotlin/org/tboox/xmake/actions/CleanConfigurationAction.kt


+ 0 - 0
src/org/tboox/xmake/actions/QuickStartAction.kt → src/main/kotlin/org/tboox/xmake/actions/QuickStartAction.kt


+ 0 - 0
src/org/tboox/xmake/actions/RebuildAction.kt → src/main/kotlin/org/tboox/xmake/actions/RebuildAction.kt


+ 0 - 0
src/org/tboox/xmake/actions/RunAction.kt → src/main/kotlin/org/tboox/xmake/actions/RunAction.kt


+ 0 - 0
src/org/tboox/xmake/icons/XMakeIconProvider.kt → src/main/kotlin/org/tboox/xmake/icons/XMakeIconProvider.kt


+ 22 - 0
src/main/kotlin/org/tboox/xmake/icons/XMakeIcons.kt

@@ -0,0 +1,22 @@
+package org.tboox.xmake.icons
+
+import com.intellij.openapi.util.IconLoader
+import javax.swing.Icon
+
+object XMakeIcons {
+
+    // logo icon
+    val XMAKE = load("/icons/xmake.png")
+
+    // file icon
+    val FILE = load("/icons/xmake.png")
+
+    // error icon
+    val ERROR = load("/icons/error.png")
+
+    // warning icon
+    val WARNING = load("/icons/warning.png")
+
+    private fun load(path: String): Icon = IconLoader.getIcon(path, XMakeIcons::class.java)
+
+}

+ 6 - 0
src/main/kotlin/org/tboox/xmake/project/XMakeConfigData.kt

@@ -0,0 +1,6 @@
+package org.tboox.xmake.project
+
+data class XMakeConfigData(
+    val languagesModel: String,
+    val kindsModel: String
+)

+ 69 - 0
src/main/kotlin/org/tboox/xmake/project/XMakeDirectoryProjectGenerator.kt

@@ -0,0 +1,69 @@
+package org.tboox.xmake.project
+
+import com.intellij.facet.ui.ValidationResult
+import com.intellij.ide.util.projectWizard.AbstractNewProjectStep
+import com.intellij.ide.util.projectWizard.CustomStepProjectGenerator
+import com.intellij.openapi.module.Module
+import com.intellij.openapi.project.Project
+import com.intellij.openapi.util.io.FileUtil
+import com.intellij.openapi.vfs.LocalFileSystem
+import com.intellij.openapi.vfs.VirtualFile
+import com.intellij.openapi.wm.impl.welcomeScreen.AbstractActionWithPanel
+import com.intellij.platform.DirectoryProjectGenerator
+import com.intellij.platform.DirectoryProjectGeneratorBase
+import com.intellij.platform.ProjectGeneratorPeer
+import org.tboox.xmake.icons.XMakeIcons
+import org.tboox.xmake.utils.SystemUtils
+import java.io.File
+import javax.swing.Icon
+
+
+class XMakeDirectoryProjectGenerator : DirectoryProjectGeneratorBase<XMakeConfigData>(),
+    CustomStepProjectGenerator<XMakeConfigData> {
+
+    private var peer: XMakeProjectGeneratorPeer? = null
+
+    override fun getName(): String = "XMake"
+    override fun getLogo(): Icon = XMakeIcons.XMAKE
+    override fun createPeer(): ProjectGeneratorPeer<XMakeConfigData> = XMakeProjectGeneratorPeer().also { peer = it }
+
+    override fun validate(baseDirPath: String): ValidationResult {
+        val crateName = File(baseDirPath).nameWithoutExtension
+        return ValidationResult.OK
+    }
+
+    override fun generateProject(project: Project, baseDir: VirtualFile, data: XMakeConfigData, module: Module) {
+        //TODO:
+        // get content entry path
+        val contentEntryPath = baseDir.canonicalPath ?: return
+        val t =listOf(
+            SystemUtils.xmakeProgram,
+            "create",
+            "-P",
+            contentEntryPath,
+            "-l",
+            data.languagesModel,
+            "-t",
+            data.kindsModel
+        ).joinToString(separator = " ")
+
+        // create empty project
+        SystemUtils.Runv(
+            listOf(
+                SystemUtils.xmakeProgram,
+                "create",
+                "-P",
+                contentEntryPath,
+                "-l",
+                data.languagesModel,
+                "-t",
+                data.kindsModel
+            )
+        )
+    }
+
+    override fun createStep(
+        projectGenerator: DirectoryProjectGenerator<XMakeConfigData>,
+        callback: AbstractNewProjectStep.AbstractCallback<XMakeConfigData>
+    ): AbstractActionWithPanel = XMakeProjectSettingsStep(projectGenerator)
+}

+ 64 - 0
src/main/kotlin/org/tboox/xmake/project/XMakeModuleBuilder.kt

@@ -0,0 +1,64 @@
+package org.tboox.xmake.project
+
+import XMakeSdkSettingsStep
+import com.intellij.ide.util.projectWizard.*
+import com.intellij.openapi.Disposable
+import com.intellij.openapi.diagnostic.Logger
+import com.intellij.openapi.module.ModuleType
+import com.intellij.openapi.projectRoots.SdkTypeId
+import com.intellij.openapi.roots.ModifiableRootModel
+import com.intellij.openapi.util.Disposer
+import com.intellij.openapi.util.io.FileUtil
+import com.intellij.openapi.vfs.LocalFileSystem
+import org.tboox.xmake.utils.SystemUtils
+
+import javax.swing.DefaultComboBoxModel
+
+class XMakeModuleBuilder : ModuleBuilder() {
+    var configurationData: XMakeConfigData? = null
+
+
+    override fun isSuitableSdkType(sdkType: SdkTypeId?): Boolean = true
+
+
+    override fun setupRootModel(rootModel: ModifiableRootModel) {
+
+        // get content entry path
+        val contentEntryPath = contentEntryPath ?: return
+
+        // get content entry
+        val contentEntry = doAddContentEntry(rootModel) ?: return
+
+        // add source root
+        val sourceRoot =
+            LocalFileSystem.getInstance().refreshAndFindFileByPath(FileUtil.toSystemIndependentName(contentEntryPath))!!
+        contentEntry.addSourceFolder(sourceRoot, false)
+
+        // create empty project
+        SystemUtils.Runv(
+            listOf(
+                SystemUtils.xmakeProgram,
+                "create",
+                "-P",
+                contentEntryPath,
+                "-l",
+                configurationData?.languagesModel.toString(),
+                "-t",
+                configurationData?.kindsModel.toString()
+            )
+        )
+    }
+
+    override fun getModuleType(): ModuleType<*> {
+        return XMakeModuleType.instance
+    }
+
+    override fun getCustomOptionsStep(context: WizardContext, parentDisposable: Disposable): ModuleWizardStep =
+        XMakeSdkSettingsStep(context).apply {
+            Disposer.register(parentDisposable, this::disposeUIResources)
+        }
+
+    companion object {
+        private val Log = Logger.getInstance(XMakeModuleBuilder::class.java.getName())
+    }
+}

+ 2 - 2
src/org/tboox/xmake/project/XMakeModuleConfigurationEditorProvider.kt → src/main/kotlin/org/tboox/xmake/project/XMakeModuleConfigurationEditorProvider.kt

@@ -2,7 +2,7 @@ package org.tboox.xmake.project
 
 import com.intellij.openapi.diagnostic.Logger
 import com.intellij.openapi.module.ModuleConfigurationEditor
-import com.intellij.openapi.roots.ui.configuration.DefaultModuleConfigurationEditorFactory
+//import com.intellij.openapi.roots.ui.configuration.DefaultModuleConfigurationEditorFactory
 import com.intellij.openapi.roots.ui.configuration.ModuleConfigurationEditorProvider
 import com.intellij.openapi.roots.ui.configuration.ModuleConfigurationState
 
@@ -11,7 +11,7 @@ class XMakeModuleConfigurationEditorProvider : ModuleConfigurationEditorProvider
     override fun createEditors(moduleConfigurationState: ModuleConfigurationState): Array<ModuleConfigurationEditor> {
 
         var editors = arrayOf<ModuleConfigurationEditor>()
-        val factory = DefaultModuleConfigurationEditorFactory.getInstance()
+//        val factory = DefaultModuleConfigurationEditorFactory.getInstance()
 
         /*
         editors += factory.createModuleContentRootsEditor(moduleConfigurationState)

+ 0 - 0
src/org/tboox/xmake/project/XMakeModuleType.kt → src/main/kotlin/org/tboox/xmake/project/XMakeModuleType.kt


+ 88 - 0
src/main/kotlin/org/tboox/xmake/project/XMakeNewProjectPanel.kt

@@ -0,0 +1,88 @@
+package org.tboox.xmake.project
+
+import com.intellij.openapi.Disposable
+import com.intellij.openapi.project.ProjectManager
+import com.intellij.openapi.roots.ui.configuration.SdkComboBox
+import com.intellij.openapi.roots.ui.configuration.SdkComboBoxModel
+import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel
+import com.intellij.openapi.ui.ComboBox
+import com.intellij.ui.layout.LayoutBuilder
+import java.awt.BorderLayout
+import javax.swing.DefaultComboBoxModel
+import javax.swing.JComponent
+import javax.swing.JPanel
+
+class XMakeNewProjectPanel : Disposable {
+
+    // the module kinds
+    private val kindsModel = DefaultComboBoxModel<String>().apply {
+        addElement("Console")
+        addElement("Static Library")
+        addElement("Shared Library")
+    }
+
+    // the module languages
+    private val languagesModel = DefaultComboBoxModel<String>().apply {
+        addElement("C")
+        addElement("C++")
+        addElement("Rust")
+        addElement("Dlang")
+        addElement("Go")
+        addElement("Swift")
+        addElement("Objc")
+        addElement("Objc++")
+    }
+
+    // the module kinds
+    private val kindsComboBox = ComboBox(kindsModel)
+
+    // the module languages
+    private val languagesComboBox = ComboBox(languagesModel)
+
+    val data: XMakeConfigData
+        get() = XMakeConfigData(
+            languagesModel.selectedItem.toString().toLowerCase(),
+            template
+        )
+
+    // get template
+    private val template: String
+        get() = when (kindsModel.selectedItem.toString()) {
+            "Console" -> "console"
+            "Static Library" -> "static"
+            "Shared Library" -> "shared"
+            else -> "console"
+        }
+
+
+    fun attachTo(layout: LayoutBuilder) = with(layout) {
+        row("XMake SDK:") {
+            val project = ProjectManager.getInstance().defaultProject
+            val sdkModel = ProjectSdksModel()
+            sdkModel.addSdk(XMakeSdkType.instance, XMakeSdkType.instance.suggestHomePath()!!, null);
+            val myJdkComboBox = SdkComboBox(SdkComboBoxModel.createSdkComboBoxModel(project, sdkModel))
+            wrapComponent(myJdkComboBox)(growX, pushX)
+        }
+        row("Module Language:") {
+            wrapComponent(languagesComboBox)(growX, pushX)
+        }
+        row("Module Type:") {
+            wrapComponent(kindsComboBox)(growX, pushX)
+        }
+
+        update()
+    }
+
+    private fun wrapComponent(component: JComponent): JComponent =
+        JPanel(BorderLayout()).apply {
+            add(component, BorderLayout.NORTH)
+        }
+
+    fun update() {
+
+    }
+
+    override fun dispose() {
+    }
+
+}

+ 0 - 0
src/org/tboox/xmake/project/XMakeProjectConfigurable.kt → src/main/kotlin/org/tboox/xmake/project/XMakeProjectConfigurable.kt


+ 26 - 0
src/main/kotlin/org/tboox/xmake/project/XMakeProjectGeneratorPeer.kt

@@ -0,0 +1,26 @@
+package org.tboox.xmake.project
+
+import com.intellij.openapi.options.ConfigurationException
+import com.intellij.openapi.ui.TextFieldWithBrowseButton
+import com.intellij.openapi.ui.ValidationInfo
+import com.intellij.platform.GeneratorPeerImpl
+import com.intellij.ui.layout.panel
+import javax.swing.JComponent
+
+class XMakeProjectGeneratorPeer : GeneratorPeerImpl<XMakeConfigData>() {
+
+    private val newProjectPanel = XMakeNewProjectPanel()
+    private var checkValid: Runnable? = null
+
+    override fun getSettings(): XMakeConfigData = newProjectPanel.data
+
+    override fun getComponent(myLocationField: TextFieldWithBrowseButton, checkValid: Runnable): JComponent {
+        this.checkValid = checkValid
+        return super.getComponent(myLocationField, checkValid)
+    }
+
+    override fun getComponent(): JComponent = panel {
+        newProjectPanel.attachTo(this)
+    }
+
+}

+ 7 - 0
src/main/kotlin/org/tboox/xmake/project/XMakeProjectSettingsStep.kt

@@ -0,0 +1,7 @@
+package org.tboox.xmake.project
+import com.intellij.ide.util.projectWizard.AbstractNewProjectStep
+import com.intellij.ide.util.projectWizard.ProjectSettingsStepBase
+import com.intellij.platform.DirectoryProjectGenerator
+
+open class XMakeProjectSettingsStep(generator: DirectoryProjectGenerator<XMakeConfigData>)
+    : ProjectSettingsStepBase<XMakeConfigData>(generator, AbstractNewProjectStep.AbstractCallback())

+ 54 - 0
src/main/kotlin/org/tboox/xmake/project/XMakeSdkSettingsStep.kt

@@ -0,0 +1,54 @@
+import com.intellij.ide.util.projectWizard.ModuleBuilder
+import com.intellij.ide.util.projectWizard.ModuleWizardStep
+import com.intellij.ide.util.projectWizard.WizardContext
+import com.intellij.openapi.module.Module
+import com.intellij.openapi.project.ProjectManager
+import com.intellij.openapi.roots.ModifiableRootModel
+import com.intellij.openapi.roots.ui.configuration.SdkComboBox
+import com.intellij.openapi.roots.ui.configuration.SdkComboBoxModel
+import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel
+import com.intellij.ui.layout.panel
+import org.jetbrains.annotations.Nullable
+import org.tboox.xmake.project.XMakeSdkType
+import java.awt.BorderLayout
+import javax.swing.JComponent
+import javax.swing.JLabel
+import javax.swing.JPanel
+import com.intellij.openapi.ui.ComboBox
+import com.intellij.openapi.util.Disposer
+import org.tboox.xmake.project.XMakeModuleBuilder
+import org.tboox.xmake.project.XMakeNewProjectPanel
+
+
+class XMakeSdkSettingsStep(
+    private val context: WizardContext,
+    private val configurationUpdaterConsumer: ((ModuleBuilder.ModuleConfigurationUpdater) -> Unit)? = null
+) : ModuleWizardStep() {
+
+    private val newProjectPanel = XMakeNewProjectPanel()
+
+    override fun getComponent(): JComponent = panel {
+        newProjectPanel.attachTo(this)
+    }
+
+    override fun disposeUIResources() = Disposer.dispose(newProjectPanel)
+
+    override fun updateDataModel() {
+        val data = newProjectPanel.data
+
+        val projectBuilder = context.projectBuilder
+        if (projectBuilder is XMakeModuleBuilder) {
+            projectBuilder.configurationData = data
+            projectBuilder.addModuleConfigurationUpdater(ConfigurationUpdater)
+        } else {
+            configurationUpdaterConsumer?.invoke(ConfigurationUpdater)
+        }
+    }
+
+    private object ConfigurationUpdater : ModuleBuilder.ModuleConfigurationUpdater() {
+
+        override fun update(module: Module, rootModel: ModifiableRootModel) {
+            //TODO:数据联动
+        }
+    }
+}

+ 0 - 0
src/org/tboox/xmake/project/XMakeSdkType.kt → src/main/kotlin/org/tboox/xmake/project/XMakeSdkType.kt


+ 3 - 3
src/org/tboox/xmake/project/XMakeToolWindowFactory.kt → src/main/kotlin/org/tboox/xmake/project/XMakeToolWindowFactory.kt

@@ -27,16 +27,16 @@ class XMakeToolWindowFactory : ToolWindowFactory {
 }
 
 // the xmake tool windows
-val Project.xmakeToolWindow: ToolWindow
+val Project.xmakeToolWindow: ToolWindow?
     get() = ToolWindowManager.getInstance(this).getToolWindow("XMake")
 
 // the xmake output panel
 val Project.xmakeOutputPanel: XMakeToolWindowOutputPanel
-    get() = this.xmakeToolWindow.contentManager.getContent(0)?.component as XMakeToolWindowOutputPanel
+    get() = this.xmakeToolWindow?.contentManager?.getContent(0)?.component as XMakeToolWindowOutputPanel
 
 // the xmake problem panel
 val Project.xmakeProblemPanel: XMakeToolWindowProblemPanel
-    get() = this.xmakeToolWindow.contentManager.getContent(1)?.component as XMakeToolWindowProblemPanel
+    get() = this.xmakeToolWindow?.contentManager?.getContent(1)?.component as XMakeToolWindowProblemPanel
 
 // the xmake console view
 val Project.xmakeConsoleView: ConsoleView

+ 7 - 4
src/org/tboox/xmake/project/XMakeToolWindowOutputPanel.kt → src/main/kotlin/org/tboox/xmake/project/XMakeToolWindowOutputPanel.kt

@@ -7,7 +7,6 @@ import com.intellij.openapi.actionSystem.ActionManager
 import com.intellij.openapi.actionSystem.ActionToolbar
 import com.intellij.openapi.actionSystem.DefaultActionGroup
 import com.intellij.openapi.diagnostic.Logger
-import com.intellij.openapi.project.CacheUpdateRunner
 import com.intellij.openapi.project.Project
 import com.intellij.openapi.ui.SimpleToolWindowPanel
 import javax.swing.JEditorPane
@@ -23,7 +22,11 @@ class XMakeToolWindowOutputPanel(project: Project) : SimpleToolWindowPanel(false
     // the toolbar
     val toolbar: ActionToolbar = run {
         val actionManager = ActionManager.getInstance()
-        actionManager.createActionToolbar("XMake Toolbar", actionManager.getAction("XMake.Menu") as DefaultActionGroup, false)
+        actionManager.createActionToolbar(
+            "XMake Toolbar",
+            actionManager.getAction("XMake.Menu") as DefaultActionGroup,
+            false
+        )
     }
 
     // the console view
@@ -45,8 +48,8 @@ class XMakeToolWindowOutputPanel(project: Project) : SimpleToolWindowPanel(false
 
     // show panel
     fun showPanel() {
-        val contentManager = project.xmakeToolWindow.contentManager
-        contentManager.setSelectedContent(contentManager.getContent(0)!!)
+        val contentManager = project.xmakeToolWindow?.contentManager
+        contentManager?.setSelectedContent(contentManager.getContent(0)!!)
     }
 
     override fun getData(dataId: String): Any? {

+ 0 - 0
src/org/tboox/xmake/project/XMakeToolWindowProblemPanel.kt → src/main/kotlin/org/tboox/xmake/project/XMakeToolWindowProblemPanel.kt


+ 19 - 13
src/org/tboox/xmake/run/XMakeProjectTasksRunner.kt → src/main/kotlin/org/tboox/xmake/run/XMakeProjectTasksRunner.kt

@@ -8,25 +8,32 @@ import com.intellij.openapi.diagnostic.Logger
 import com.intellij.openapi.project.Project
 import com.intellij.task.*
 import com.intellij.task.ExecuteRunConfigurationTask
+import org.jetbrains.concurrency.AsyncPromise
+import org.jetbrains.concurrency.Promise
 import org.tboox.xmake.project.xmakeConsoleView
 import org.tboox.xmake.utils.SystemUtils
 import org.tboox.xmake.shared.xmakeConfiguration
 
 class XMakeProjectTasksRunner : ProjectTaskRunner() {
 
-    override fun run(project: Project, context: ProjectTaskContext, callback: ProjectTaskNotification?, tasks: MutableCollection<out ProjectTask>) {
-
+    override fun run(
+        project: Project,
+        context: ProjectTaskContext,
+        callback: ProjectTaskNotification?,
+        tasks: MutableCollection<out ProjectTask>
+    ) {
         // clear console first
         project.xmakeConsoleView.clear()
 
         // configure and build it
         val xmakeConfiguration = project.xmakeConfiguration
         if (xmakeConfiguration.changed) {
-            SystemUtils.runvInConsole(project, xmakeConfiguration.configurationCommandLine).addProcessListener(object: ProcessAdapter() {
-                override fun processTerminated(e: ProcessEvent) {
-                    SystemUtils.runvInConsole(project, xmakeConfiguration.buildCommandLine, false, true, true)
-                }
-            })
+            SystemUtils.runvInConsole(project, xmakeConfiguration.configurationCommandLine)
+                .addProcessListener(object : ProcessAdapter() {
+                    override fun processTerminated(e: ProcessEvent) {
+                        SystemUtils.runvInConsole(project, xmakeConfiguration.buildCommandLine, false, true, true)
+                    }
+                })
             xmakeConfiguration.changed = false
         } else {
             SystemUtils.runvInConsole(project, xmakeConfiguration.buildCommandLine, true, true, true)
@@ -40,11 +47,6 @@ class XMakeProjectTasksRunner : ProjectTaskRunner() {
             return true
         }
 
-        /*
-        // hook 'Build Artifacts' => package
-        if (projectTask is ArtifactBuildTask) {
-            return true
-        }*/
 
         // run configuration?
         if (projectTask is ExecuteRunConfigurationTask) {
@@ -57,7 +59,11 @@ class XMakeProjectTasksRunner : ProjectTaskRunner() {
         return false
     }
 
-    override fun createExecutionEnvironment(project: Project, task: ExecuteRunConfigurationTask, executor: Executor?): ExecutionEnvironment? = null
+    override fun createExecutionEnvironment(
+        project: Project,
+        task: ExecuteRunConfigurationTask,
+        executor: Executor?
+    ): ExecutionEnvironment? = null
 
     companion object {
 

+ 12 - 8
src/org/tboox/xmake/run/XMakeRunConfiguration.kt → src/main/kotlin/org/tboox/xmake/run/XMakeRunConfiguration.kt

@@ -14,8 +14,10 @@ import org.tboox.xmake.project.xmakeConsoleView
 import org.tboox.xmake.shared.xmakeConfiguration
 import org.tboox.xmake.utils.SystemUtils
 
-class XMakeRunConfiguration(project: Project, name: String, factory: ConfigurationFactory
-) : LocatableConfigurationBase(project, factory, name), RunConfigurationWithSuppressedDefaultDebugAction {
+class XMakeRunConfiguration(
+    project: Project, name: String, factory: ConfigurationFactory
+) : LocatableConfigurationBase<RunProfileState>(project, factory, name),
+    RunConfigurationWithSuppressedDefaultDebugAction {
 
     // the run target
     var runTarget: String = "default"
@@ -76,11 +78,12 @@ class XMakeRunConfiguration(project: Project, name: String, factory: Configurati
         // configure and run it
         val xmakeConfiguration = project.xmakeConfiguration
         if (xmakeConfiguration.changed) {
-            SystemUtils.runvInConsole(project, xmakeConfiguration.configurationCommandLine).addProcessListener(object: ProcessAdapter() {
-                override fun processTerminated(e: ProcessEvent) {
-                    SystemUtils.runvInConsole(project, runCommandLine, false, true, true)
-                }
-            })
+            SystemUtils.runvInConsole(project, xmakeConfiguration.configurationCommandLine)
+                .addProcessListener(object : ProcessAdapter() {
+                    override fun processTerminated(e: ProcessEvent) {
+                        SystemUtils.runvInConsole(project, runCommandLine, false, true, true)
+                    }
+                })
             xmakeConfiguration.changed = false
         } else {
             SystemUtils.runvInConsole(project, runCommandLine, true, true, true)
@@ -103,7 +106,8 @@ private fun Element.writeString(name: String, value: String) {
     addContent(opt)
 }
 
-private fun Element.readString(name: String): String? = children.find { it.name == "option" && it.getAttributeValue("name") == name }?.getAttributeValue("value")
+private fun Element.readString(name: String): String? =
+    children.find { it.name == "option" && it.getAttributeValue("name") == name }?.getAttributeValue("value")
 
 
 private fun Element.writeBool(name: String, value: Boolean) {

+ 0 - 0
src/org/tboox/xmake/run/XMakeRunConfigurationEditor.kt → src/main/kotlin/org/tboox/xmake/run/XMakeRunConfigurationEditor.kt


+ 0 - 0
src/org/tboox/xmake/run/XMakeRunConfigurationProducer.kt → src/main/kotlin/org/tboox/xmake/run/XMakeRunConfigurationProducer.kt


+ 16 - 15
src/org/tboox/xmake/run/XMakeRunConfigurationType.kt → src/main/kotlin/org/tboox/xmake/run/XMakeRunConfigurationType.kt

@@ -1,6 +1,5 @@
 package org.tboox.xmake.run
 
-import com.intellij.compiler.options.CompileStepBeforeRun
 import com.intellij.execution.BeforeRunTask
 import com.intellij.execution.configurations.ConfigurationFactory
 import com.intellij.execution.configurations.ConfigurationTypeBase
@@ -11,24 +10,26 @@ import com.intellij.openapi.util.Key
 import org.tboox.xmake.icons.XMakeIcons
 
 class XMakeRunConfigurationType : ConfigurationTypeBase(
-        "XMakeRunConfiguration",
-        "XMake",
-        "XMake run command configuration",
-        XMakeIcons.XMAKE
+    "XMakeRunConfiguration",
+    "XMake",
+    "XMake run command configuration",
+    XMakeIcons.XMAKE
 ) {
     init {
         addFactory(object : ConfigurationFactory(this) {
             override fun createTemplateConfiguration(project: Project): RunConfiguration =
-                    XMakeRunConfiguration(project, "XMake", this)
-
-            override fun configureBeforeRunTaskDefaults(providerID: Key<out BeforeRunTask<BeforeRunTask<*>>>,
-                                                        task: BeforeRunTask<out BeforeRunTask<*>>) {
-
-                if (providerID == CompileStepBeforeRun.ID) {
-                    // We don't use jps, so we don't need to execute `Make` task
-                    // before run configuration is executed
-                    task.isEnabled = false
-                }
+                XMakeRunConfiguration(project, "XMake", this)
+
+            override fun configureBeforeRunTaskDefaults(
+                providerID: Key<out BeforeRunTask<BeforeRunTask<*>>>,
+                task: BeforeRunTask<out BeforeRunTask<*>>
+            ) {
+
+//                if (providerID == CompileStepBeforeRun.ID) {
+//                    // We don't use jps, so we don't need to execute `Make` task
+//                    // before run configuration is executed
+//                    task.isEnabled = false
+//                }
             }
 
             override fun isConfigurationSingletonByDefault(): Boolean = true

+ 0 - 0
src/org/tboox/xmake/run/XMakeRunner.kt → src/main/kotlin/org/tboox/xmake/run/XMakeRunner.kt


+ 0 - 0
src/org/tboox/xmake/shared/XMakeConfiguration.kt → src/main/kotlin/org/tboox/xmake/shared/XMakeConfiguration.kt


+ 0 - 0
src/org/tboox/xmake/shared/XMakeProblem.kt → src/main/kotlin/org/tboox/xmake/shared/XMakeProblem.kt


+ 10 - 9
src/org/tboox/xmake/utils/ConsoleProcessHandler.kt → src/main/kotlin/org/tboox/xmake/utils/ConsoleProcessHandler.kt

@@ -9,7 +9,11 @@ import com.intellij.execution.configurations.GeneralCommandLine
 import java.io.IOException
 import java.io.OutputStreamWriter
 
-class ConsoleProcessHandler(private val consoleView: ConsoleView, commandLine: GeneralCommandLine, showExitCode: Boolean = false) : KillableColoredProcessHandler(commandLine) {
+class ConsoleProcessHandler(
+    private val consoleView: ConsoleView,
+    commandLine: GeneralCommandLine,
+    showExitCode: Boolean = false
+) : KillableColoredProcessHandler(commandLine) {
 
     // the output content
     var outputContent = ""
@@ -17,21 +21,18 @@ class ConsoleProcessHandler(private val consoleView: ConsoleView, commandLine: G
     // initialize
     init {
 
-        // add colored text listener
-        this.addColoredTextListener(object: AnsiEscapeDecoder.ColoredTextAcceptor {
-            override fun coloredTextAvailable(text: String, attributes: Key<*>) {
-                append(text, attributes)
-            }
-        })
-        
         // shows exit code upon termination
         if (showExitCode) {
             ProcessTerminatedListener.attach(this)
         }
     }
 
+    override fun coloredTextAvailable(textOriginal: String, attributes: Key<*>) {
+        append(textOriginal, attributes)
+    }
+
     // append info to the console view
-    private fun append(s: String, k: Key<*>?) {
+    private fun append(s: String, k: Key<*>) {
         this.consoleView.print(s, ConsoleViewContentType.getConsoleViewType(k))
         outputContent += s
     }

+ 1 - 1
src/org/tboox/xmake/utils/SystemUtils.kt → src/main/kotlin/org/tboox/xmake/utils/SystemUtils.kt

@@ -221,7 +221,7 @@ object SystemUtils {
         if (showConsole) {
 
             // show tool window first
-            project.xmakeToolWindow.show {
+            project.xmakeToolWindow?.show {
                 project.xmakeOutputPanel.showPanel()
             }
         }

+ 4 - 0
src/main/resources/META-INF/clion-only.xml

@@ -0,0 +1,4 @@
+<idea-plugin xmlns:xi="http://www.w3.org/2001/XInclude" allow-bundled-update="true">
+    <depends>com.intellij.cidr.base</depends>
+    <depends>com.intellij.clion</depends>
+</idea-plugin>

+ 2 - 0
src/main/resources/META-INF/idea-only.xml

@@ -0,0 +1,2 @@
+<idea-plugin>
+</idea-plugin>

+ 130 - 0
src/main/resources/META-INF/plugin.xml

@@ -0,0 +1,130 @@
+<!-- plugin-docs: https://www.jetbrains.org/intellij/sdk/docs/basics.html -->
+<idea-plugin>
+    <id>org.tboox.xmake</id>
+    <name>XMake</name>
+    <version>1.0.5</version>
+    <vendor email="[email protected]" url="http://www.tboox.org">tboox.org</vendor>
+
+    <description><![CDATA[
+    A XMake integration plugin in Intellij Platform<br>
+    <p><a href="https://github.com/xmake-io/xmake-idea">Source Code</a> | <a href="https://gitter.im/tboox/tboox?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge">Gitter</a> | <a href="http://xmake.io/pages/donation.html#donate">Donate</a> | <a href="http://xmake.io">XMake Homepage</a></p>
+    Features:
+    <ul>
+        <li>xmake</li>
+        <ul>
+            <li>C/C++/Objc/Swift/Rust/Dlang/Golang ... support</li>
+            <li>Cross-platform support</li>
+            <li>Lua syntax</li>
+            <li><a href="https://github.com/xmake-io/xmake">More features and info about xmake</a></li>
+        </ul>
+        <li>Quickstart</li>
+        <li>Create project</li>
+        <li>Project configuration</li>
+        <li>Run configuration</li>
+        <li>Menu tools</li>
+        <li>Tool windows</li>
+        <li>Build and run</li>
+        <li>Goto error and waring problems</li>
+    </ul>
+    <p>中国朋友可以加QQ群交流及反馈BUG: 343118190</p>
+    ]]></description>
+
+    <change-notes><![CDATA[
+    <strong>1.0.5</strong>
+    <ul>
+        <li>[FIX]: Fix conflict issues with java</li>
+    </ul>
+    <strong>1.0.4</strong>
+    <ul>
+        <li>[NEW]: Modify rebuild icon</li>
+    </ul>
+    <strong>1.0.3</strong>
+    <ul>
+        <li>[NEW]: Improve exit code</li>
+    </ul>
+    <strong>1.0.2</strong>
+    <ul>
+        <li>[NEW]: Create project (c/c++/rust/go/dlang/swift/objc)</li>
+    </ul>
+    <strong>1.0.1</strong>
+    <ul>
+        <li>[NEW]: Quickstart</li>
+        <li>[NEW]: Project configuration</li>
+        <li>[NEW]: Run configuration</li>
+        <li>[NEW]: Menu tools</li>
+        <li>[NEW]: Tool windows</li>
+        <li>[NEW]: Build and run</li>
+        <li>[NEW]: Goto error and waring problems</li>
+    </ul>
+    ]]>
+    </change-notes>
+
+    <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
+    <idea-version since-build="201.0"/>
+
+    <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
+         on how to target different products -->
+    <!--    <depends>com.intellij.modules.java</depends>-->
+    <depends>com.intellij.modules.lang</depends>
+    <depends>com.intellij.modules.platform</depends>
+    <depends optional="true" config-file="clion-only.xml">com.intellij.modules.clion</depends>
+
+    <extensions defaultExtensionNs="com.intellij">
+
+        <!-- icons -->
+        <iconProvider implementation="org.tboox.xmake.icons.XMakeIconProvider"/>
+
+        <!-- module configurations -->
+        <!-- clion not support -->
+        <sdkType implementation="org.tboox.xmake.project.XMakeSdkType"/>
+        <moduleType id="XMake.Module" implementationClass="org.tboox.xmake.project.XMakeModuleType"/>
+        <moduleBuilder builderClass="org.tboox.xmake.project.XMakeModuleBuilder"/>
+
+        <directoryProjectGenerator implementation="org.tboox.xmake.project.XMakeDirectoryProjectGenerator"/>
+
+        <!-- project configurations -->
+        <projectConfigurable instance="org.tboox.xmake.project.XMakeProjectConfigurable" displayName="XMake"
+                             groupId="language"/>
+        <toolWindow id="XMake" anchor="bottom" factoryClass="org.tboox.xmake.project.XMakeToolWindowFactory"
+                    icon="/icons/xmake_13x13.png"/>
+
+        <!-- run configurations -->
+        <programRunner implementation="org.tboox.xmake.run.XMakeRunner"/>
+        <configurationType implementation="org.tboox.xmake.run.XMakeRunConfigurationType"/>
+        <runConfigurationProducer implementation="org.tboox.xmake.run.XMakeRunConfigurationProducer"/>
+
+    </extensions>
+
+    <!--
+    group id
+         http://keithlea.com/idea-actions/
+         https://github.com/centic9/IntelliJ-Action-IDs
+    -->
+    <actions>
+        <group id="XMake.Menu" text="XMake" description="XMake Menu">
+            <add-to-group group-id="MainMenu" anchor="after" relative-to-action="RunMenu"/>
+            <action id="XMake.Run" class="org.tboox.xmake.actions.RunAction" text="Run Target" icon="/icons/run.png"
+                    description="Run the current target."/>
+            <action id="XMake.Build" class="org.tboox.xmake.actions.BuildAction" text="Build Project"
+                    icon="/icons/build.png" description="Build the current project."/>
+            <action id="XMake.Rebuild" class="org.tboox.xmake.actions.RebuildAction" text="Rebuild Project"
+                    icon="/icons/rebuild.png" description="Rebuild the current project."/>
+            <action id="XMake.Clean" class="org.tboox.xmake.actions.CleanAction" text="Clean Project"
+                    icon="/icons/clean.png" description="Clean target and object files."/>
+            <separator/>
+            <reference id="editRunConfigurations"/>
+            <action id="XMake.CleanConfiguration" class="org.tboox.xmake.actions.CleanConfigurationAction"
+                    text="Clean Configuration" icon="/icons/cleanconf.png"
+                    description="Clean the current configuration."/>
+            <separator/>
+            <action id="XMake.QuickStart" class="org.tboox.xmake.actions.QuickStartAction" text="Quick Start"
+                    icon="/icons/quickstart.png" description="Quick start a new project."/>
+        </group>
+    </actions>
+
+    <project-components>
+        <component>
+            <implementation-class>org.tboox.xmake.shared.XMakeConfiguration</implementation-class>
+        </component>
+    </project-components>
+</idea-plugin>

BIN
src/main/resources/icons/build.png


BIN
src/main/resources/icons/[email protected]


BIN
src/main/resources/icons/build@2x_dark.png


BIN
src/main/resources/icons/build_dark.png


BIN
src/main/resources/icons/clean.png


BIN
src/main/resources/icons/[email protected]


BIN
src/main/resources/icons/cleanconf.png


BIN
src/main/resources/icons/[email protected]


BIN
src/main/resources/icons/debug.png


BIN
src/main/resources/icons/[email protected]


BIN
src/main/resources/icons/debug@2x_dark.png


BIN
src/main/resources/icons/debug_dark.png


BIN
src/main/resources/icons/error.png


BIN
src/main/resources/icons/[email protected]


BIN
src/main/resources/icons/quickstart.png


BIN
src/main/resources/icons/[email protected]


BIN
src/main/resources/icons/rebuild.png


BIN
src/main/resources/icons/[email protected]


BIN
src/main/resources/icons/rebuild@2x_dark.png


BIN
src/main/resources/icons/rebuild_dark.png


BIN
src/main/resources/icons/run.png


BIN
src/main/resources/icons/[email protected]


BIN
src/main/resources/icons/settings.png


BIN
src/main/resources/icons/[email protected]


BIN
src/main/resources/icons/settings@2x_dark.png


BIN
src/main/resources/icons/settings_dark.png


BIN
src/main/resources/icons/warning.png


BIN
src/main/resources/icons/[email protected]


BIN
src/main/resources/icons/xmake.png


BIN
src/main/resources/icons/[email protected]


BIN
src/main/resources/icons/xmake_13x13.png


+ 0 - 18
src/org/tboox/xmake/icons/XMakeIcons.kt

@@ -1,18 +0,0 @@
-package org.tboox.xmake.icons
-
-import com.intellij.openapi.util.IconLoader
-
-object XMakeIcons {
-
-    // logo icon
-    val XMAKE = IconLoader.getIcon("/icons/xmake.png")
-
-    // file icon
-    val FILE = IconLoader.getIcon("/icons/xmake.png")
-
-    // error icon
-    val ERROR = IconLoader.getIcon("/icons/error.png")
-
-    // warning icon
-    val WARNING = IconLoader.getIcon("/icons/warning.png")
-}

+ 0 - 76
src/org/tboox/xmake/project/XMakeModuleBuilder.kt

@@ -1,76 +0,0 @@
-package org.tboox.xmake.project
-
-import com.intellij.ide.util.projectWizard.*
-import com.intellij.openapi.diagnostic.Logger
-import com.intellij.openapi.module.ModuleType
-import com.intellij.openapi.roots.ModifiableRootModel
-import com.intellij.openapi.util.io.FileUtil
-import com.intellij.openapi.vfs.LocalFileSystem
-import org.tboox.xmake.utils.SystemUtils
-
-import javax.swing.DefaultComboBoxModel
-import java.io.File
-
-class XMakeModuleBuilder : ModuleBuilder() {
-
-    // the module kinds
-    val kindsModel = DefaultComboBoxModel<String>().apply {
-        addElement("Console")
-        addElement("Static Library")
-        addElement("Shared Library")
-    }
-
-    // the module languages
-    val languagesModel = DefaultComboBoxModel<String>().apply {
-        addElement("C")
-        addElement("C++")
-        addElement("Rust")
-        addElement("Dlang")
-        addElement("Go")
-        addElement("Swift")
-        addElement("Objc")
-        addElement("Objc++")
-    }
-
-    // get language
-    val language : String
-        get() = languagesModel.selectedItem.toString().toLowerCase()
-
-    // get template
-    val template : String
-        get() = when (kindsModel.selectedItem.toString()) {
-            "Console" -> "console"
-            "Static Library" -> "static"
-            "Shared Library" -> "shared"
-            else -> "console"
-        }
-
-
-    override fun setupRootModel(rootModel: ModifiableRootModel) {
-
-        // get content entry path
-        val contentEntryPath = contentEntryPath ?: return
-
-        // get content entry
-        val contentEntry = doAddContentEntry(rootModel) ?: return
-
-        // add source root
-        val sourceRoot = LocalFileSystem.getInstance().refreshAndFindFileByPath(FileUtil.toSystemIndependentName(contentEntryPath))!!
-        contentEntry.addSourceFolder(sourceRoot, false)
-
-        // create empty project
-        SystemUtils.Runv(listOf(SystemUtils.xmakeProgram, "create", "-P", contentEntryPath, "-n", name, "-l", language, "-t", template))
-    }
-
-    override fun getModuleType(): ModuleType<*> {
-        return XMakeModuleType.instance
-    }
-
-    override fun modifyProjectTypeStep(settingsStep: SettingsStep): ModuleWizardStep? {
-        return XMakeSdkSettingsStep(settingsStep, this)
-    }
-
-    companion object {
-        private val Log = Logger.getInstance(XMakeModuleBuilder::class.java.getName())
-    }
-}

+ 0 - 24
src/org/tboox/xmake/project/XMakeSdkSettingsStep.kt

@@ -1,24 +0,0 @@
-package org.tboox.xmake.project
-
-import com.intellij.ide.util.projectWizard.ModuleBuilder
-import com.intellij.ide.util.projectWizard.SettingsStep
-import com.intellij.ide.util.projectWizard.SdkSettingsStep
-import com.intellij.openapi.ui.ComboBox
-
-class XMakeSdkSettingsStep(settingsStep: SettingsStep, moduleBuilder: ModuleBuilder) : SdkSettingsStep(settingsStep, moduleBuilder, { sdkTypeId -> XMakeSdkType.instance === sdkTypeId }) {
-
-    // the module kinds
-    private val kindsComboBox = ComboBox<String>((moduleBuilder as XMakeModuleBuilder).kindsModel)
-
-    // the module languages
-    private val languagesComboBox = ComboBox<String>((moduleBuilder as XMakeModuleBuilder).languagesModel)
-
-    init {
-        settingsStep.addSettingsField("Module Language", languagesComboBox)
-        settingsStep.addSettingsField("Module Type", kindsComboBox)
-    }
-
-    override fun updateDataModel() {
-        super.updateDataModel()
-    }
-}