2222import ee .carlrobert .codegpt .actions .toolwindow .ClearChatWindowAction ;
2323import ee .carlrobert .codegpt .actions .toolwindow .CreateNewConversationAction ;
2424import ee .carlrobert .codegpt .actions .toolwindow .OpenInEditorAction ;
25+ import ee .carlrobert .codegpt .completions .ConversationType ;
2526import ee .carlrobert .codegpt .conversations .Conversation ;
2627import ee .carlrobert .codegpt .conversations .ConversationService ;
27- import ee .carlrobert .codegpt .conversations .ConversationsState ;
28+ import ee .carlrobert .codegpt .conversations .message .Message ;
29+ import ee .carlrobert .codegpt .psistructure .models .ClassStructure ;
2830import ee .carlrobert .codegpt .settings .service .FeatureType ;
2931import ee .carlrobert .codegpt .settings .models .ModelSettings ;
3032import ee .carlrobert .codegpt .settings .prompts .PersonaPromptDetailsState ;
3537import ee .carlrobert .codegpt .settings .service .codegpt .CodeGPTUserDetailsNotifier ;
3638import ee .carlrobert .codegpt .toolwindow .chat .ui .ToolWindowFooterNotification ;
3739import ee .carlrobert .codegpt .toolwindow .chat .ui .textarea .AttachImageNotifier ;
40+ import java .awt .CardLayout ;
3841import java .nio .file .Path ;
42+ import java .util .Set ;
3943import javax .swing .JComponent ;
44+ import javax .swing .JPanel ;
4045import org .jetbrains .annotations .NotNull ;
4146
4247public class ChatToolWindowPanel extends SimpleToolWindowPanel {
4348
49+ private static final String LANDING_CARD = "LANDING" ;
50+ private static final String TABS_CARD = "TABS" ;
51+
4452 private final ToolWindowFooterNotification imageFileAttachmentNotification ;
4553 private final ActionLink upgradePlanLink ;
4654 private final ChatToolWindowTabbedPane tabbedPane ;
55+ private final JPanel centerPanel ;
56+ private final CardLayout centerLayout ;
4757 private final Project project ;
58+ private ChatToolWindowTabPanel landingPanel ;
4859
4960 public ChatToolWindowPanel (
5061 @ NotNull Project project ,
@@ -60,22 +71,16 @@ public ChatToolWindowPanel(
6071 upgradePlanLink .setExternalLinkIcon ();
6172 upgradePlanLink .setVisible (false );
6273
63- var tabPanel = new ChatToolWindowTabPanel (project , getConversation ());
6474 tabbedPane = new ChatToolWindowTabbedPane (parentDisposable );
65- tabbedPane .addNewTab (tabPanel );
75+ tabbedPane .setTabLifecycleCallbacks (this ::showTabsView , this ::showLandingView );
76+ centerLayout = new CardLayout ();
77+ centerPanel = new JPanel (centerLayout );
78+ centerPanel .add (tabbedPane , TABS_CARD );
6679
6780 initToolWindowPanel (project );
6881 initializeEventListeners (project );
69-
70- Disposer .register (parentDisposable , tabPanel );
71- }
72-
73- private Conversation getConversation () {
74- var conversation = ConversationsState .getCurrentConversation ();
75- if (conversation == null ) {
76- return ConversationService .getInstance ().startConversation (project );
77- }
78- return conversation ;
82+ showLandingView ();
83+ Disposer .register (parentDisposable , this ::disposeLandingPanel );
7984 }
8085
8186 private void initializeEventListeners (Project project ) {
@@ -107,6 +112,63 @@ public ChatToolWindowTabbedPane getChatTabbedPane() {
107112 return tabbedPane ;
108113 }
109114
115+ public ChatToolWindowTabPanel createAndSelectNewTabPanel () {
116+ return createAndSelectConversationTab (ConversationService .getInstance ().startConversation (project ));
117+ }
118+
119+ public ChatToolWindowTabPanel createAndSelectConversationTab (Conversation conversation ) {
120+ var panel = new ChatToolWindowTabPanel (project , conversation );
121+ tabbedPane .addNewTab (panel );
122+ showTabsView ();
123+ return panel ;
124+ }
125+
126+ public void showTabsView () {
127+ centerLayout .show (centerPanel , TABS_CARD );
128+ }
129+
130+ public void requestFocusForInput () {
131+ tabbedPane .tryFindActiveTabPanel ()
132+ .ifPresentOrElse (
133+ ChatToolWindowTabPanel ::requestFocusForTextArea ,
134+ () -> {
135+ if (landingPanel != null ) {
136+ landingPanel .requestFocusForTextArea ();
137+ }
138+ });
139+ }
140+
141+ public void showLandingView () {
142+ disposeLandingPanel ();
143+ landingPanel = createLandingPanel ();
144+ centerPanel .add (landingPanel .getContent (), LANDING_CARD );
145+ centerLayout .show (centerPanel , LANDING_CARD );
146+ landingPanel .requestFocusForTextArea ();
147+ centerPanel .revalidate ();
148+ centerPanel .repaint ();
149+ }
150+
151+ private ChatToolWindowTabPanel createLandingPanel () {
152+ var conversation = ConversationService .getInstance ().createConversation ();
153+ conversation .setProjectPath (project .getBasePath ());
154+ return new ChatToolWindowTabPanel (project , conversation , this ::promoteLandingDraftToTab );
155+ }
156+
157+ private void promoteLandingDraftToTab (Message message , Set <ClassStructure > psiStructure ) {
158+ var tabPanel = createAndSelectNewTabPanel ();
159+ tabPanel .sendMessage (message , ConversationType .DEFAULT , psiStructure );
160+ }
161+
162+ private void disposeLandingPanel () {
163+ if (landingPanel == null ) {
164+ return ;
165+ }
166+
167+ centerPanel .remove (landingPanel .getContent ());
168+ Disposer .dispose (landingPanel );
169+ landingPanel = null ;
170+ }
171+
110172 public void clearImageNotifications (Project project ) {
111173 imageFileAttachmentNotification .hideNotification ();
112174
@@ -115,9 +177,7 @@ public void clearImageNotifications(Project project) {
115177
116178 private void initToolWindowPanel (Project project ) {
117179 Runnable onAddNewTab = () -> {
118- tabbedPane .addNewTab (new ChatToolWindowTabPanel (
119- project ,
120- ConversationService .getInstance ().startConversation (project )));
180+ createAndSelectNewTabPanel ();
121181 repaint ();
122182 revalidate ();
123183 };
@@ -127,7 +187,7 @@ private void initToolWindowPanel(Project project) {
127187 .addToLeft (createActionToolbar (project , tabbedPane , onAddNewTab ).getComponent ())
128188 .addToRight (upgradePlanLink ));
129189 setContent (new BorderLayoutPanel ()
130- .addToCenter (tabbedPane )
190+ .addToCenter (centerPanel )
131191 .addToBottom (imageFileAttachmentNotification ));
132192 });
133193 }
0 commit comments