11package ee .carlrobert .codegpt .settings .service ;
22
3+ import static ee .carlrobert .codegpt .ui .UIUtil .createRadioButtonsPanel ;
34import static java .util .stream .Collectors .toList ;
45
56import com .intellij .icons .AllIcons .Actions ;
67import com .intellij .openapi .application .ApplicationManager ;
8+ import com .intellij .openapi .fileChooser .FileChooserDescriptorFactory ;
79import com .intellij .openapi .ui .MessageType ;
10+ import com .intellij .openapi .ui .TextBrowseFolderListener ;
11+ import com .intellij .openapi .ui .TextFieldWithBrowseButton ;
812import com .intellij .openapi .ui .panel .ComponentPanelBuilder ;
913import com .intellij .openapi .util .io .FileUtil ;
1014import com .intellij .ui .PortField ;
1115import com .intellij .ui .TitledSeparator ;
1216import com .intellij .ui .components .JBLabel ;
17+ import com .intellij .ui .components .JBRadioButton ;
1318import com .intellij .ui .components .JBTextField ;
1419import com .intellij .ui .components .fields .IntegerField ;
1520import com .intellij .util .ui .FormBuilder ;
2227import ee .carlrobert .codegpt .settings .state .LlamaSettingsState ;
2328import ee .carlrobert .codegpt .ui .OverlayUtil ;
2429import java .awt .BorderLayout ;
30+ import java .awt .CardLayout ;
2531import java .io .File ;
2632import java .util .Arrays ;
2733import java .util .Collections ;
3440
3541public class LlamaServiceSelectionForm extends JPanel {
3642
43+ private static final String BUNDLED_SERVER_FORM_CARD_CODE = "BundledServerSettings" ;
44+ private static final String CUSTOM_SERVER_FORM_CARD_CODE = "CustomServerSettings" ;
45+
3746 private final LlamaModelPreferencesForm llamaModelPreferencesForm ;
3847 private final LlamaRequestPreferencesForm llamaRequestPreferencesForm ;
3948 private final PortField portField ;
4049 private final IntegerField maxTokensField ;
4150 private final IntegerField threadsField ;
4251 private final JBTextField additionalParametersField ;
52+ private final CardLayout cardLayout ;
53+ private final JBRadioButton bundledServerRadioButton ;
54+ private final JBRadioButton customServerRadioButton ;
55+ private final TextFieldWithBrowseButton browsableCustomServerTextField ;
4356
4457 public LlamaServiceSelectionForm () {
4558 var llamaServerAgent =
@@ -65,6 +78,15 @@ public LlamaServiceSelectionForm() {
6578 additionalParametersField = new JBTextField (llamaSettings .getAdditionalParameters (), 30 );
6679 additionalParametersField .setEnabled (!serverRunning );
6780
81+ cardLayout = new CardLayout ();
82+ bundledServerRadioButton = new JBRadioButton ("Use bundled server" ,
83+ !llamaSettings .isUseCustomServer ());
84+ customServerRadioButton = new JBRadioButton ("Use custom server" ,
85+ llamaSettings .isUseCustomServer ());
86+ browsableCustomServerTextField = createBrowsableCustomServerTextField (
87+ !llamaServerAgent .isServerRunning ());
88+ browsableCustomServerTextField .setText (llamaSettings .getCustomLlamaServerPath ());
89+
6890 init (llamaServerAgent );
6991 }
7092
@@ -89,6 +111,12 @@ private JComponent withEmptyLeftBorder(JComponent component) {
89111 return component ;
90112 }
91113
114+ public String getActualServerPath () {
115+ return isUseCustomServer ()
116+ ? getCustomServerPath ()
117+ : CodeGPTPlugin .getLlamaSourcePath () + File .separator + "server" ;
118+ }
119+
92120 public int getContextSize () {
93121 return maxTokensField .getValue ();
94122 }
@@ -123,6 +151,22 @@ public List<String> getListOfAdditionalParameters() {
123151 .collect (toList ());
124152 }
125153
154+ public void setIsUseCustomServer (boolean useCustomServer ) {
155+ customServerRadioButton .setSelected (useCustomServer );
156+ }
157+
158+ public boolean isUseCustomServer () {
159+ return customServerRadioButton .isSelected ();
160+ }
161+
162+ public void setCustomServerPath (String customServerPath ) {
163+ browsableCustomServerTextField .setText (customServerPath );
164+ }
165+
166+ public String getCustomServerPath () {
167+ return browsableCustomServerTextField .getText ();
168+ }
169+
126170 private void init (LlamaServerAgent llamaServerAgent ) {
127171 var serverProgressPanel = new ServerProgressPanel ();
128172 serverProgressPanel .setBorder (JBUI .Borders .emptyRight (16 ));
@@ -134,6 +178,7 @@ private void init(LlamaServerAgent llamaServerAgent) {
134178 .addComponent (new TitledSeparator (
135179 CodeGPTBundle .get ("settingsConfigurable.service.llama.serverPreferences.title" )))
136180 .addComponent (withEmptyLeftBorder (FormBuilder .createFormBuilder ()
181+ .addComponent (getForm ())
137182 .addLabeledComponent (
138183 CodeGPTBundle .get ("shared.port" ),
139184 JBUI .Panels .simplePanel ()
@@ -165,6 +210,60 @@ private void init(LlamaServerAgent llamaServerAgent) {
165210 .getPanel ());
166211 }
167212
213+ public JPanel getForm () {
214+ JPanel finalPanel = new JPanel (new BorderLayout ());
215+ finalPanel .add (createRadioButtonsPanel (bundledServerRadioButton , customServerRadioButton ),
216+ BorderLayout .NORTH );
217+ finalPanel .add (createFormPanelCards (), BorderLayout .CENTER );
218+ return finalPanel ;
219+ }
220+
221+ private JPanel createFormPanelCards () {
222+ var formPanelCards = new JPanel (cardLayout );
223+ formPanelCards .setBorder (JBUI .Borders .emptyLeft (16 ));
224+ formPanelCards .add (new JPanel (), BUNDLED_SERVER_FORM_CARD_CODE );
225+ formPanelCards .add (createCustomServerForm (), CUSTOM_SERVER_FORM_CARD_CODE );
226+ cardLayout .show (
227+ formPanelCards ,
228+ bundledServerRadioButton .isSelected ()
229+ ? BUNDLED_SERVER_FORM_CARD_CODE
230+ : CUSTOM_SERVER_FORM_CARD_CODE );
231+
232+ bundledServerRadioButton .addActionListener (e ->
233+ cardLayout .show (formPanelCards , BUNDLED_SERVER_FORM_CARD_CODE ));
234+ customServerRadioButton .addActionListener (e ->
235+ cardLayout .show (formPanelCards , CUSTOM_SERVER_FORM_CARD_CODE ));
236+
237+ return formPanelCards ;
238+ }
239+
240+ private JPanel createCustomServerForm () {
241+ var customModelHelpText = ComponentPanelBuilder .createCommentComponent (
242+ CodeGPTBundle .get ("settingsConfigurable.service.llama.customServerPath.comment" ),
243+ true );
244+ customModelHelpText .setBorder (JBUI .Borders .empty (0 , 4 ));
245+
246+ return FormBuilder .createFormBuilder ()
247+ .addLabeledComponent (
248+ CodeGPTBundle .get ("settingsConfigurable.service.llama.customServerPath.label" ),
249+ browsableCustomServerTextField )
250+ .addComponentToRightColumn (customModelHelpText )
251+ .addVerticalGap (4 )
252+ .addComponentFillVertically (new JPanel (), 0 )
253+ .getPanel ();
254+ }
255+
256+ private TextFieldWithBrowseButton createBrowsableCustomServerTextField (boolean enabled ) {
257+ var browseButton = new TextFieldWithBrowseButton ();
258+ browseButton .setEnabled (enabled );
259+
260+ var fileChooserDescriptor = FileChooserDescriptorFactory .createSingleFileDescriptor ();
261+ fileChooserDescriptor .setForcedToUseIdeaFileChooser (true );
262+ fileChooserDescriptor .setHideIgnored (false );
263+ browseButton .addBrowseFolderListener (new TextBrowseFolderListener (fileChooserDescriptor ));
264+ return browseButton ;
265+ }
266+
168267 private JLabel createComment (String messageKey ) {
169268 var comment = ComponentPanelBuilder .createCommentComponent (
170269 CodeGPTBundle .get (messageKey ), true );
@@ -193,6 +292,8 @@ private JButton getServerButton(
193292 disableForm (serverButton , serverProgressPanel );
194293 llamaServerAgent .startAgent (
195294 new LlamaServerStartupParams (
295+ getActualServerPath (),
296+ isUseCustomServer (),
196297 llamaModelPreferencesForm .getActualModelPath (),
197298 getContextSize (),
198299 getThreads (),
0 commit comments