From 375ff150dbf4fb77bf137c0c62f5c0b03a525a42 Mon Sep 17 00:00:00 2001 From: Gul Ahmed Date: Tue, 11 Jul 2023 04:31:42 +0500 Subject: [PATCH 01/12] CodeSync Tool Window Button --- .../intellij/sdk/codesync/CodeSyncButton.java | 106 ++++++++++++++++++ src/main/resources/META-INF/plugin.xml | 2 + 2 files changed, 108 insertions(+) create mode 100644 src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java diff --git a/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java b/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java new file mode 100644 index 00000000..f7411d6a --- /dev/null +++ b/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java @@ -0,0 +1,106 @@ +package org.intellij.sdk.codesync; + +import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.wm.ToolWindow; +import com.intellij.openapi.wm.ToolWindowFactory; +import com.intellij.ui.content.Content; +import com.intellij.ui.content.ContentFactory; +import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; +import org.jdom.Element; + +import javax.swing.*; +import java.awt.*; +import java.util.Calendar; +import java.util.Objects; + +public class CodeSyncButton implements ToolWindowFactory, DumbAware { + + @Override + public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) { + CalendarToolWindowContent toolWindowContent = new CalendarToolWindowContent(toolWindow); + Content content = ContentFactory.SERVICE.getInstance().createContent(toolWindowContent.getContentPanel(), "", false); + toolWindow.getContentManager().addContent(content); + } + + private static class CalendarToolWindowContent { + + private static final String CALENDAR_ICON_PATH = "/icons/Calendar-icon.png"; + private static final String TIME_ZONE_ICON_PATH = "/icons/Time-zone-icon.png"; + private static final String TIME_ICON_PATH = "/icons/Time-icon.png"; + + private final JPanel contentPanel = new JPanel(); + private final JLabel currentDate = new JLabel(); + private final JLabel timeZone = new JLabel(); + private final JLabel currentTime = new JLabel(); + + public CalendarToolWindowContent(ToolWindow toolWindow) { + contentPanel.setLayout(new BorderLayout(0, 20)); + contentPanel.setBorder(BorderFactory.createEmptyBorder(40, 0, 0, 0)); + contentPanel.add(createCalendarPanel(), BorderLayout.PAGE_START); + contentPanel.add(createControlsPanel(toolWindow), BorderLayout.CENTER); + updateCurrentDateTime(); + } + + @NotNull + private JPanel createCalendarPanel() { + JPanel calendarPanel = new JPanel(); + setIconLabel(currentDate, CALENDAR_ICON_PATH); + setIconLabel(timeZone, TIME_ZONE_ICON_PATH); + setIconLabel(currentTime, TIME_ICON_PATH); + calendarPanel.add(currentDate); + calendarPanel.add(timeZone); + calendarPanel.add(currentTime); + return calendarPanel; + } + + private void setIconLabel(JLabel label, String imagePath) { + label.setIcon(new ImageIcon(Objects.requireNonNull(getClass().getResource(imagePath)))); + } + + @NotNull + private JPanel createControlsPanel(ToolWindow toolWindow) { + JPanel controlsPanel = new JPanel(); + JButton refreshDateAndTimeButton = new JButton("Refresh"); + refreshDateAndTimeButton.addActionListener(e -> updateCurrentDateTime()); + controlsPanel.add(refreshDateAndTimeButton); + JButton hideToolWindowButton = new JButton("Hide"); + hideToolWindowButton.addActionListener(e -> toolWindow.hide(null)); + controlsPanel.add(hideToolWindowButton); + return controlsPanel; + } + + private void updateCurrentDateTime() { + Calendar calendar = Calendar.getInstance(); + currentDate.setText(getCurrentDate(calendar)); + timeZone.setText(getTimeZone(calendar)); + currentTime.setText(getCurrentTime(calendar)); + } + + private String getCurrentDate(Calendar calendar) { + return calendar.get(Calendar.DAY_OF_MONTH) + "/" + + (calendar.get(Calendar.MONTH) + 1) + "/" + + calendar.get(Calendar.YEAR); + } + + private String getTimeZone(Calendar calendar) { + long gmtOffset = calendar.get(Calendar.ZONE_OFFSET); // offset from GMT in milliseconds + String gmtOffsetString = String.valueOf(gmtOffset / 3600000); + return (gmtOffset > 0) ? "GMT + " + gmtOffsetString : "GMT - " + gmtOffsetString; + } + + private String getCurrentTime(Calendar calendar) { + return getFormattedValue(calendar, Calendar.HOUR_OF_DAY) + ":" + getFormattedValue(calendar, Calendar.MINUTE); + } + + private String getFormattedValue(Calendar calendar, int calendarField) { + int value = calendar.get(calendarField); + return StringUtils.leftPad(Integer.toString(value), 2, "0"); + } + + public JPanel getContentPanel() { + return contentPanel; + } + } +} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 6e83ba67..89f42438 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -75,5 +75,7 @@ + From 7504c325c61739908d31831f72ee7297faf4659f Mon Sep 17 00:00:00 2001 From: Gul Ahmed Date: Wed, 12 Jul 2023 09:38:43 +0500 Subject: [PATCH 02/12] Created basic strucutre of Tool Window --- .../intellij/sdk/codesync/CodeSyncButton.java | 120 +++++++++--------- 1 file changed, 62 insertions(+), 58 deletions(-) diff --git a/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java b/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java index f7411d6a..a914cd5f 100644 --- a/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java +++ b/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java @@ -1,11 +1,16 @@ package org.intellij.sdk.codesync; +import com.intellij.icons.AllIcons; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowFactory; +import com.intellij.ui.Colors; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentFactory; +import com.intellij.util.io.Compressor; +import com.twelvemonkeys.imageio.metadata.jpeg.JPEG; +import icons.CodeSyncIcons; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.jdom.Element; @@ -19,84 +24,83 @@ public class CodeSyncButton implements ToolWindowFactory, DumbAware { @Override public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) { - CalendarToolWindowContent toolWindowContent = new CalendarToolWindowContent(toolWindow); + CodeSyncButtons toolWindowContent = new CodeSyncButtons(toolWindow); Content content = ContentFactory.SERVICE.getInstance().createContent(toolWindowContent.getContentPanel(), "", false); toolWindow.getContentManager().addContent(content); } - private static class CalendarToolWindowContent { - - private static final String CALENDAR_ICON_PATH = "/icons/Calendar-icon.png"; - private static final String TIME_ZONE_ICON_PATH = "/icons/Time-zone-icon.png"; - private static final String TIME_ICON_PATH = "/icons/Time-icon.png"; + private static class CodeSyncButtons { private final JPanel contentPanel = new JPanel(); - private final JLabel currentDate = new JLabel(); - private final JLabel timeZone = new JLabel(); - private final JLabel currentTime = new JLabel(); + private final JPanel leftPanel = new JPanel(); + private final JPanel rightPanel = new JPanel(); - public CalendarToolWindowContent(ToolWindow toolWindow) { + public CodeSyncButtons(ToolWindow toolWindow) { contentPanel.setLayout(new BorderLayout(0, 20)); - contentPanel.setBorder(BorderFactory.createEmptyBorder(40, 0, 0, 0)); - contentPanel.add(createCalendarPanel(), BorderLayout.PAGE_START); - contentPanel.add(createControlsPanel(toolWindow), BorderLayout.CENTER); - updateCurrentDateTime(); - } + contentPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - @NotNull - private JPanel createCalendarPanel() { - JPanel calendarPanel = new JPanel(); - setIconLabel(currentDate, CALENDAR_ICON_PATH); - setIconLabel(timeZone, TIME_ZONE_ICON_PATH); - setIconLabel(currentTime, TIME_ICON_PATH); - calendarPanel.add(currentDate); - calendarPanel.add(timeZone); - calendarPanel.add(currentTime); - return calendarPanel; - } + leftPanel.setLayout(new BorderLayout()); + rightPanel.setLayout(new BorderLayout()); + + leftPanel.setBackground(Color.BLACK); - private void setIconLabel(JLabel label, String imagePath) { - label.setIcon(new ImageIcon(Objects.requireNonNull(getClass().getResource(imagePath)))); + leftPanel.setPreferredSize(new Dimension((int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.8), 0)); + rightPanel.setPreferredSize(new Dimension((int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.2), 0)); + + contentPanel.add(leftPanel, BorderLayout.WEST); + contentPanel.add(rightPanel, BorderLayout.CENTER); + + JPanel controlsPanel = createControlsPanel(toolWindow); + + rightPanel.add(controlsPanel, BorderLayout.CENTER); } @NotNull private JPanel createControlsPanel(ToolWindow toolWindow) { JPanel controlsPanel = new JPanel(); - JButton refreshDateAndTimeButton = new JButton("Refresh"); - refreshDateAndTimeButton.addActionListener(e -> updateCurrentDateTime()); - controlsPanel.add(refreshDateAndTimeButton); - JButton hideToolWindowButton = new JButton("Hide"); - hideToolWindowButton.addActionListener(e -> toolWindow.hide(null)); - controlsPanel.add(hideToolWindowButton); - return controlsPanel; - } + controlsPanel.setLayout(new GridBagLayout()); - private void updateCurrentDateTime() { - Calendar calendar = Calendar.getInstance(); - currentDate.setText(getCurrentDate(calendar)); - timeZone.setText(getTimeZone(calendar)); - currentTime.setText(getCurrentTime(calendar)); - } + JPanel buttonListPanel = new JPanel(); + buttonListPanel.setLayout(new BoxLayout(buttonListPanel, BoxLayout.Y_AXIS)); - private String getCurrentDate(Calendar calendar) { - return calendar.get(Calendar.DAY_OF_MONTH) + "/" - + (calendar.get(Calendar.MONTH) + 1) + "/" - + calendar.get(Calendar.YEAR); - } + JButton viewFilePlaybackButton = new JButton("View File Playback"); + JButton viewRepoPlaybackButton = new JButton("View Repo Playback"); + JButton viewDashboardButton = new JButton("View Dashboard"); - private String getTimeZone(Calendar calendar) { - long gmtOffset = calendar.get(Calendar.ZONE_OFFSET); // offset from GMT in milliseconds - String gmtOffsetString = String.valueOf(gmtOffset / 3600000); - return (gmtOffset > 0) ? "GMT + " + gmtOffsetString : "GMT - " + gmtOffsetString; - } + JButton connectToolWindowButton = new JButton("Connect Repo"); + connectToolWindowButton.addActionListener( + e -> { + if(connectToolWindowButton.getText() == "Connect Repo"){ + connectToolWindowButton.setText("Disconnect Repo"); + toolWindow.setIcon(CodeSyncIcons.getCodeSyncIcon()); + }else{ + connectToolWindowButton.setText("Connect Repo"); + toolWindow.setIcon(AllIcons.Toolwindows.Problems); + } + } + ); - private String getCurrentTime(Calendar calendar) { - return getFormattedValue(calendar, Calendar.HOUR_OF_DAY) + ":" + getFormattedValue(calendar, Calendar.MINUTE); - } - private String getFormattedValue(Calendar calendar, int calendarField) { - int value = calendar.get(calendarField); - return StringUtils.leftPad(Integer.toString(value), 2, "0"); + JButton logoutToolWindowButton = new JButton("Logout"); + logoutToolWindowButton.addActionListener(e -> toolWindow.hide(null)); + + viewFilePlaybackButton.setAlignmentX(Component.CENTER_ALIGNMENT); + viewRepoPlaybackButton.setAlignmentX(Component.CENTER_ALIGNMENT); + viewDashboardButton.setAlignmentX(Component.CENTER_ALIGNMENT); + connectToolWindowButton.setAlignmentX(Component.CENTER_ALIGNMENT); + logoutToolWindowButton.setAlignmentX(Component.CENTER_ALIGNMENT); + + buttonListPanel.add(viewFilePlaybackButton); + buttonListPanel.add(viewRepoPlaybackButton); + buttonListPanel.add(viewDashboardButton); + buttonListPanel.add(connectToolWindowButton); + buttonListPanel.add(logoutToolWindowButton); + + buttonListPanel.setAlignmentY(Component.CENTER_ALIGNMENT); + + controlsPanel.add(buttonListPanel); + + return controlsPanel; } public JPanel getContentPanel() { From 1cbed79bf2b97e67a43a6bb853c57d7b940670cf Mon Sep 17 00:00:00 2001 From: Gul Ahmed Date: Wed, 12 Jul 2023 09:43:00 +0500 Subject: [PATCH 03/12] Resolved sonar cloud issue --- .../org/intellij/sdk/codesync/CodeSyncButton.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java b/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java index a914cd5f..1cdd3a01 100644 --- a/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java +++ b/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java @@ -35,6 +35,8 @@ private static class CodeSyncButtons { private final JPanel leftPanel = new JPanel(); private final JPanel rightPanel = new JPanel(); + private final String CONNECT_REPO = "Connect Repo"; + public CodeSyncButtons(ToolWindow toolWindow) { contentPanel.setLayout(new BorderLayout(0, 20)); contentPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); @@ -66,21 +68,18 @@ private JPanel createControlsPanel(ToolWindow toolWindow) { JButton viewFilePlaybackButton = new JButton("View File Playback"); JButton viewRepoPlaybackButton = new JButton("View Repo Playback"); JButton viewDashboardButton = new JButton("View Dashboard"); - - JButton connectToolWindowButton = new JButton("Connect Repo"); + JButton connectToolWindowButton = new JButton(CONNECT_REPO); connectToolWindowButton.addActionListener( e -> { - if(connectToolWindowButton.getText() == "Connect Repo"){ + if(connectToolWindowButton.getText() == CONNECT_REPO){ connectToolWindowButton.setText("Disconnect Repo"); toolWindow.setIcon(CodeSyncIcons.getCodeSyncIcon()); }else{ - connectToolWindowButton.setText("Connect Repo"); + connectToolWindowButton.setText(CONNECT_REPO); toolWindow.setIcon(AllIcons.Toolwindows.Problems); } } ); - - JButton logoutToolWindowButton = new JButton("Logout"); logoutToolWindowButton.addActionListener(e -> toolWindow.hide(null)); From e77465df31c246115ae0d540474cdeb147334a54 Mon Sep 17 00:00:00 2001 From: Gul Ahmed Date: Wed, 12 Jul 2023 09:45:31 +0500 Subject: [PATCH 04/12] Resolved sonar cloud issue --- .../java/org/intellij/sdk/codesync/CodeSyncButton.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java b/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java index 1cdd3a01..1e74486b 100644 --- a/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java +++ b/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java @@ -35,7 +35,7 @@ private static class CodeSyncButtons { private final JPanel leftPanel = new JPanel(); private final JPanel rightPanel = new JPanel(); - private final String CONNECT_REPO = "Connect Repo"; + private final static String connectRepo = "Connect Repo"; public CodeSyncButtons(ToolWindow toolWindow) { contentPanel.setLayout(new BorderLayout(0, 20)); @@ -68,14 +68,14 @@ private JPanel createControlsPanel(ToolWindow toolWindow) { JButton viewFilePlaybackButton = new JButton("View File Playback"); JButton viewRepoPlaybackButton = new JButton("View Repo Playback"); JButton viewDashboardButton = new JButton("View Dashboard"); - JButton connectToolWindowButton = new JButton(CONNECT_REPO); + JButton connectToolWindowButton = new JButton(connectRepo); connectToolWindowButton.addActionListener( e -> { - if(connectToolWindowButton.getText() == CONNECT_REPO){ + if(connectToolWindowButton.getText() == connectRepo){ connectToolWindowButton.setText("Disconnect Repo"); toolWindow.setIcon(CodeSyncIcons.getCodeSyncIcon()); }else{ - connectToolWindowButton.setText(CONNECT_REPO); + connectToolWindowButton.setText(connectRepo); toolWindow.setIcon(AllIcons.Toolwindows.Problems); } } From 575d5d62bbb568266c1925e49865cda05cc8eb9d Mon Sep 17 00:00:00 2001 From: Gul Ahmed Date: Wed, 12 Jul 2023 09:47:47 +0500 Subject: [PATCH 05/12] Resolved sonar cloud issue --- .../java/org/intellij/sdk/codesync/CodeSyncButton.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java b/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java index 1e74486b..3041a572 100644 --- a/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java +++ b/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java @@ -35,7 +35,7 @@ private static class CodeSyncButtons { private final JPanel leftPanel = new JPanel(); private final JPanel rightPanel = new JPanel(); - private final static String connectRepo = "Connect Repo"; + private final static String CONNECT_REPO = "Connect Repo"; public CodeSyncButtons(ToolWindow toolWindow) { contentPanel.setLayout(new BorderLayout(0, 20)); @@ -68,14 +68,14 @@ private JPanel createControlsPanel(ToolWindow toolWindow) { JButton viewFilePlaybackButton = new JButton("View File Playback"); JButton viewRepoPlaybackButton = new JButton("View Repo Playback"); JButton viewDashboardButton = new JButton("View Dashboard"); - JButton connectToolWindowButton = new JButton(connectRepo); + JButton connectToolWindowButton = new JButton(CONNECT_REPO); connectToolWindowButton.addActionListener( e -> { - if(connectToolWindowButton.getText() == connectRepo){ + if(connectToolWindowButton.getText().equals(CONNECT_REPO)){ connectToolWindowButton.setText("Disconnect Repo"); toolWindow.setIcon(CodeSyncIcons.getCodeSyncIcon()); }else{ - connectToolWindowButton.setText(connectRepo); + connectToolWindowButton.setText(CONNECT_REPO); toolWindow.setIcon(AllIcons.Toolwindows.Problems); } } From b4369119a2cd8116dc046ec47d881f212634e938 Mon Sep 17 00:00:00 2001 From: Gul Ahmed Date: Wed, 12 Jul 2023 09:49:30 +0500 Subject: [PATCH 06/12] Resolved sonar cloud issue --- src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java b/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java index 3041a572..c4823337 100644 --- a/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java +++ b/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java @@ -35,7 +35,7 @@ private static class CodeSyncButtons { private final JPanel leftPanel = new JPanel(); private final JPanel rightPanel = new JPanel(); - private final static String CONNECT_REPO = "Connect Repo"; + private static final String CONNECT_REPO = "Connect Repo"; public CodeSyncButtons(ToolWindow toolWindow) { contentPanel.setLayout(new BorderLayout(0, 20)); From ae0f4755ce66ddccd9867c0f5f4ecbeb9088a33e Mon Sep 17 00:00:00 2001 From: Gul Ahmed Date: Thu, 13 Jul 2023 10:02:30 +0500 Subject: [PATCH 07/12] Moved CodeSync button to primary section(left hand side), resized menu buttons to same size --- .../intellij/sdk/codesync/CodeSyncButton.java | 19 ++++++++++--------- src/main/resources/META-INF/plugin.xml | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java b/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java index c4823337..3b2b2162 100644 --- a/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java +++ b/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java @@ -5,20 +5,13 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowFactory; -import com.intellij.ui.Colors; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentFactory; -import com.intellij.util.io.Compressor; -import com.twelvemonkeys.imageio.metadata.jpeg.JPEG; import icons.CodeSyncIcons; -import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; -import org.jdom.Element; import javax.swing.*; import java.awt.*; -import java.util.Calendar; -import java.util.Objects; public class CodeSyncButton implements ToolWindowFactory, DumbAware { @@ -27,6 +20,7 @@ public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindo CodeSyncButtons toolWindowContent = new CodeSyncButtons(toolWindow); Content content = ContentFactory.SERVICE.getInstance().createContent(toolWindowContent.getContentPanel(), "", false); toolWindow.getContentManager().addContent(content); + toolWindow.setSplitMode(false, null); } private static class CodeSyncButtons { @@ -49,8 +43,8 @@ public CodeSyncButtons(ToolWindow toolWindow) { leftPanel.setPreferredSize(new Dimension((int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.8), 0)); rightPanel.setPreferredSize(new Dimension((int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.2), 0)); - contentPanel.add(leftPanel, BorderLayout.WEST); - contentPanel.add(rightPanel, BorderLayout.CENTER); + contentPanel.add(leftPanel, BorderLayout.CENTER); + contentPanel.add(rightPanel, BorderLayout.WEST); JPanel controlsPanel = createControlsPanel(toolWindow); @@ -89,6 +83,13 @@ private JPanel createControlsPanel(ToolWindow toolWindow) { connectToolWindowButton.setAlignmentX(Component.CENTER_ALIGNMENT); logoutToolWindowButton.setAlignmentX(Component.CENTER_ALIGNMENT); + Dimension buttonSize = new Dimension(200, 50); + viewFilePlaybackButton.setMaximumSize(buttonSize); + viewRepoPlaybackButton.setMaximumSize(buttonSize); + viewDashboardButton.setMaximumSize(buttonSize); + connectToolWindowButton.setMaximumSize(buttonSize); + logoutToolWindowButton.setMaximumSize(buttonSize); + buttonListPanel.add(viewFilePlaybackButton); buttonListPanel.add(viewRepoPlaybackButton); buttonListPanel.add(viewDashboardButton); diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 89f42438..45c0c740 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -76,6 +76,6 @@ + doNotActivateOnStart="false" factoryClass="org.intellij.sdk.codesync.CodeSyncButton"/> From bf7c0e9e675a077a6775149e1330a9ef61d78ba3 Mon Sep 17 00:00:00 2001 From: Gul Ahmed Date: Fri, 21 Jul 2023 07:37:09 +0500 Subject: [PATCH 08/12] Refactored for scalling --- .../intellij/sdk/codesync/CodeSyncButton.java | 110 ------------------ .../sdk/codesync/toolWindow/ButtonList.java | 19 +++ .../codesync/toolWindow/CodeSyncButton.java | 15 +++ .../sdk/codesync/toolWindow/CodeSyncMenu.java | 16 +++ .../toolWindow/CodeSyncToolWindow.java | 33 ++++++ .../toolWindow/CodeSyncToolWindowButton.java | 20 ++++ src/main/resources/META-INF/plugin.xml | 2 +- 7 files changed, 104 insertions(+), 111 deletions(-) delete mode 100644 src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java create mode 100644 src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java create mode 100644 src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncButton.java create mode 100644 src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncMenu.java create mode 100644 src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java create mode 100644 src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindowButton.java diff --git a/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java b/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java deleted file mode 100644 index 3b2b2162..00000000 --- a/src/main/java/org/intellij/sdk/codesync/CodeSyncButton.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.intellij.sdk.codesync; - -import com.intellij.icons.AllIcons; -import com.intellij.openapi.project.DumbAware; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.wm.ToolWindow; -import com.intellij.openapi.wm.ToolWindowFactory; -import com.intellij.ui.content.Content; -import com.intellij.ui.content.ContentFactory; -import icons.CodeSyncIcons; -import org.jetbrains.annotations.NotNull; - -import javax.swing.*; -import java.awt.*; - -public class CodeSyncButton implements ToolWindowFactory, DumbAware { - - @Override - public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) { - CodeSyncButtons toolWindowContent = new CodeSyncButtons(toolWindow); - Content content = ContentFactory.SERVICE.getInstance().createContent(toolWindowContent.getContentPanel(), "", false); - toolWindow.getContentManager().addContent(content); - toolWindow.setSplitMode(false, null); - } - - private static class CodeSyncButtons { - - private final JPanel contentPanel = new JPanel(); - private final JPanel leftPanel = new JPanel(); - private final JPanel rightPanel = new JPanel(); - - private static final String CONNECT_REPO = "Connect Repo"; - - public CodeSyncButtons(ToolWindow toolWindow) { - contentPanel.setLayout(new BorderLayout(0, 20)); - contentPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - - leftPanel.setLayout(new BorderLayout()); - rightPanel.setLayout(new BorderLayout()); - - leftPanel.setBackground(Color.BLACK); - - leftPanel.setPreferredSize(new Dimension((int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.8), 0)); - rightPanel.setPreferredSize(new Dimension((int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.2), 0)); - - contentPanel.add(leftPanel, BorderLayout.CENTER); - contentPanel.add(rightPanel, BorderLayout.WEST); - - JPanel controlsPanel = createControlsPanel(toolWindow); - - rightPanel.add(controlsPanel, BorderLayout.CENTER); - } - - @NotNull - private JPanel createControlsPanel(ToolWindow toolWindow) { - JPanel controlsPanel = new JPanel(); - controlsPanel.setLayout(new GridBagLayout()); - - JPanel buttonListPanel = new JPanel(); - buttonListPanel.setLayout(new BoxLayout(buttonListPanel, BoxLayout.Y_AXIS)); - - JButton viewFilePlaybackButton = new JButton("View File Playback"); - JButton viewRepoPlaybackButton = new JButton("View Repo Playback"); - JButton viewDashboardButton = new JButton("View Dashboard"); - JButton connectToolWindowButton = new JButton(CONNECT_REPO); - connectToolWindowButton.addActionListener( - e -> { - if(connectToolWindowButton.getText().equals(CONNECT_REPO)){ - connectToolWindowButton.setText("Disconnect Repo"); - toolWindow.setIcon(CodeSyncIcons.getCodeSyncIcon()); - }else{ - connectToolWindowButton.setText(CONNECT_REPO); - toolWindow.setIcon(AllIcons.Toolwindows.Problems); - } - } - ); - JButton logoutToolWindowButton = new JButton("Logout"); - logoutToolWindowButton.addActionListener(e -> toolWindow.hide(null)); - - viewFilePlaybackButton.setAlignmentX(Component.CENTER_ALIGNMENT); - viewRepoPlaybackButton.setAlignmentX(Component.CENTER_ALIGNMENT); - viewDashboardButton.setAlignmentX(Component.CENTER_ALIGNMENT); - connectToolWindowButton.setAlignmentX(Component.CENTER_ALIGNMENT); - logoutToolWindowButton.setAlignmentX(Component.CENTER_ALIGNMENT); - - Dimension buttonSize = new Dimension(200, 50); - viewFilePlaybackButton.setMaximumSize(buttonSize); - viewRepoPlaybackButton.setMaximumSize(buttonSize); - viewDashboardButton.setMaximumSize(buttonSize); - connectToolWindowButton.setMaximumSize(buttonSize); - logoutToolWindowButton.setMaximumSize(buttonSize); - - buttonListPanel.add(viewFilePlaybackButton); - buttonListPanel.add(viewRepoPlaybackButton); - buttonListPanel.add(viewDashboardButton); - buttonListPanel.add(connectToolWindowButton); - buttonListPanel.add(logoutToolWindowButton); - - buttonListPanel.setAlignmentY(Component.CENTER_ALIGNMENT); - - controlsPanel.add(buttonListPanel); - - return controlsPanel; - } - - public JPanel getContentPanel() { - return contentPanel; - } - } -} diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java new file mode 100644 index 00000000..c0dd958b --- /dev/null +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java @@ -0,0 +1,19 @@ +package org.intellij.sdk.codesync.toolWindow; + +import javax.swing.*; +import java.awt.*; + +public class ButtonList extends JPanel { + + public ButtonList(){ + this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + + this.add(new CodeSyncButton("View File Playback")); + this.add(new CodeSyncButton("View Dashboard")); + this.add(new CodeSyncButton("Connect Repo")); + this.add(new CodeSyncButton("Logout")); + + this.setAlignmentX(Component.CENTER_ALIGNMENT); + } + +} diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncButton.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncButton.java new file mode 100644 index 00000000..6c022d94 --- /dev/null +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncButton.java @@ -0,0 +1,15 @@ +package org.intellij.sdk.codesync.toolWindow; + +import javax.swing.*; +import java.awt.*; + +public class CodeSyncButton extends JButton { + + public CodeSyncButton(String buttonText){ + super(buttonText); + this.setAlignmentX(Component.CENTER_ALIGNMENT); + Dimension dimension = new Dimension(200, 50); + this.setMaximumSize(dimension); + } + +} diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncMenu.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncMenu.java new file mode 100644 index 00000000..c1873daa --- /dev/null +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncMenu.java @@ -0,0 +1,16 @@ +package org.intellij.sdk.codesync.toolWindow; + +import javax.swing.*; +import java.awt.*; + +public class CodeSyncMenu extends JPanel { + + CodeSyncMenu(){ + JPanel controlsPanel = new JPanel(); + controlsPanel.setLayout(new GridBagLayout()); + controlsPanel.add(new ButtonList()); + + this.add(controlsPanel); + } + +} diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java new file mode 100644 index 00000000..80ea5390 --- /dev/null +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java @@ -0,0 +1,33 @@ +package org.intellij.sdk.codesync.toolWindow; + +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import java.awt.*; + +public class CodeSyncToolWindow extends JPanel { + + private final JPanel contentPanel = new JPanel(); + private final JPanel leftPanel = new JPanel(); + private final JPanel rightPanel = new JPanel(); + + public CodeSyncToolWindow() { + contentPanel.setLayout(new BorderLayout(0, 20)); + contentPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + + leftPanel.setLayout(new BorderLayout()); + rightPanel.setLayout(new BorderLayout()); + + leftPanel.setPreferredSize(new Dimension((int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.8), 0)); + rightPanel.setPreferredSize(new Dimension((int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.2), 0)); + + contentPanel.add(leftPanel, BorderLayout.CENTER); + contentPanel.add(rightPanel, BorderLayout.WEST); + + rightPanel.add(new CodeSyncMenu(), BorderLayout.CENTER); + } + + public JPanel getContentPanel() { + return contentPanel; + } +} diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindowButton.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindowButton.java new file mode 100644 index 00000000..d9d3e259 --- /dev/null +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindowButton.java @@ -0,0 +1,20 @@ +package org.intellij.sdk.codesync.toolWindow; + +import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.wm.ToolWindow; +import com.intellij.openapi.wm.ToolWindowFactory; +import com.intellij.ui.content.Content; +import com.intellij.ui.content.ContentFactory; +import org.jetbrains.annotations.NotNull; + +public class CodeSyncToolWindowButton implements ToolWindowFactory, DumbAware { + + @Override + public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) { + CodeSyncToolWindow toolWindowContent = new CodeSyncToolWindow(); + Content content = ContentFactory.SERVICE.getInstance().createContent(toolWindowContent.getContentPanel(), "", false); + toolWindow.getContentManager().addContent(content); + toolWindow.setSplitMode(false, null); + } +} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 45c0c740..03ca9aed 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -76,6 +76,6 @@ + doNotActivateOnStart="false" factoryClass="org.intellij.sdk.codesync.toolWindow.CodeSyncToolWindowButton"/> From 6b2da6b3acc84fcc6443fb927f08ff15cdbc461b Mon Sep 17 00:00:00 2001 From: Gul Ahmed Date: Mon, 24 Jul 2023 06:37:13 +0500 Subject: [PATCH 09/12] Added all menus and messages --- .../sdk/codesync/toolWindow/ButtonList.java | 182 +++++++++++++++++- .../codesync/toolWindow/CodeSyncButton.java | 2 +- .../codesync/toolWindow/CodeSyncLabel.java | 15 ++ .../sdk/codesync/toolWindow/CodeSyncMenu.java | 1 - .../toolWindow/CodeSyncToolWindow.java | 25 +-- src/main/resources/META-INF/plugin.xml | 2 +- 6 files changed, 209 insertions(+), 18 deletions(-) create mode 100644 src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncLabel.java diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java index c0dd958b..76685552 100644 --- a/src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java @@ -1,19 +1,193 @@ package org.intellij.sdk.codesync.toolWindow; +import com.intellij.openapi.project.Project; +import org.intellij.sdk.codesync.state.PluginState; +import org.intellij.sdk.codesync.state.StateUtils; +import org.intellij.sdk.codesync.utils.CommonUtils; +import org.intellij.sdk.codesync.utils.ProjectUtils; + import javax.swing.*; import java.awt.*; public class ButtonList extends JPanel { + static boolean userLoggedIn = false; + static boolean repoConnected = false; + static boolean needToAvailTrail = false; + static boolean needToUpgradeToPro = false; + static boolean isNestedRepo = false; + static boolean isIgnoredNestedRepo = true; + + CodeSyncLabel loginMessage = new CodeSyncLabel("Login and connect the repository to start streaming your code."); + CodeSyncLabel connectRepoMessage = new CodeSyncLabel("Great! Now just connect the repository to start streaming your code."); + CodeSyncLabel userCanStreamMessage = new CodeSyncLabel("Your repository is in sync."); + CodeSyncLabel tryProForFreeMessage = new CodeSyncLabel("Your repository size is exceeding the free limit. \n Try Pro for free to continue using CodeSync."); + CodeSyncLabel upgradeToProMessage = new CodeSyncLabel("Your free trial of CodeSync has ended. \n Please upgrade your plan to continue using CodeSync, or contact sales."); + CodeSyncLabel nestedDirMessage = new CodeSyncLabel("This file is ignored by .syncignore and is not in sync with CodeSync."); + CodeSyncLabel nestedIgnoredDirMessage = new CodeSyncLabel("Current directory is ignored by a parent directory for streaming. \n To include this directory/file, remove it from the .syncignore file."); + + + CodeSyncButton login = new CodeSyncButton("Login"); + CodeSyncButton logout = new CodeSyncButton("Logout"); + CodeSyncButton connectRepository = new CodeSyncButton("Connect Repository"); + CodeSyncButton disconnectRepository = new CodeSyncButton("Disconnect Repository"); + CodeSyncButton viewFilePlayback = new CodeSyncButton("View File Playback"); + CodeSyncButton viewDashboard = new CodeSyncButton("View Dashboard"); + CodeSyncButton tryProForFree = new CodeSyncButton("Try Pro For Free"); + CodeSyncButton upgradeToPro = new CodeSyncButton("Upgrade To Pro"); + CodeSyncButton openSyncIgnoreFile = new CodeSyncButton("Open .syncignore File"); + CodeSyncButton viewParentRepositoryOnWeb = new CodeSyncButton("View Parent Repository on Web"); + CodeSyncButton unsyncParentRepository = new CodeSyncButton("Unsync Parent Repository"); + public ButtonList(){ + this.addingActionListeners(); + paint(); + } + + private void paint(){ + this.removeAll(); this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - this.add(new CodeSyncButton("View File Playback")); - this.add(new CodeSyncButton("View Dashboard")); - this.add(new CodeSyncButton("Connect Repo")); - this.add(new CodeSyncButton("Logout")); + Project project = CommonUtils.getCurrentProject(); + String repoPath = ProjectUtils.getRepoPath(project); + PluginState pluginState = StateUtils.getState(repoPath); + PluginState globalState = StateUtils.getGlobalState(); + + if(!userLoggedIn){ //Replace it with !globalState.isAuthenticated + userNotLoggedIn(); + }else if(isNestedRepo){ + if(isIgnoredNestedRepo){ + syncIgnoredNestedDirOpen(); + }else{ + nestedDirOpen(); + } + }else if(!repoConnected){ //Replace it with !pluginState.isRepoInSync + repositoryNotConnected(); + }else if(needToAvailTrail){ + userNeedToAvailTrail(); + }else if(needToUpgradeToPro){ + userNeedToUpgradeToPro(); + }else { + userCanStream(); + } this.setAlignmentX(Component.CENTER_ALIGNMENT); } + private void addingActionListeners(){ + login.addActionListener(e -> loginAction()); + logout.addActionListener(e -> logoutAction()); + connectRepository.addActionListener(e -> connectRepositoryAction()); + disconnectRepository.addActionListener(e -> disconnectRepositoryAction()); + viewFilePlayback.addActionListener(e -> viewFilePlaybackAction()); + viewDashboard.addActionListener(e -> viewDashboardAction()); + tryProForFree.addActionListener(e -> tryProForFreeAction()); + upgradeToPro.addActionListener(e -> upgradeToProAction()); + openSyncIgnoreFile.addActionListener(e -> openSyncIgnoreFileAction()); + viewParentRepositoryOnWeb.addActionListener(e -> viewParentRepositoryOnWebAction()); + unsyncParentRepository.addActionListener(e -> unsyncParentRepositoryAction()); + } + + private void loginAction(){ + System.out.println("Login Button Clicked"); + this.userLoggedIn = true; + CodeSyncToolWindow.updateMenu(); + } + + private void logoutAction(){ + System.out.println("Logout Button Clicked"); + this.userLoggedIn = false; + CodeSyncToolWindow.updateMenu(); + } + + private void connectRepositoryAction(){ + System.out.println("Connect Repository Button Clicked"); + this.repoConnected = true; + CodeSyncToolWindow.updateMenu(); + } + + private void disconnectRepositoryAction(){ + System.out.println("Disconnect Repository Button Clicked"); + this.repoConnected = false; + CodeSyncToolWindow.updateMenu(); + } + + private void viewFilePlaybackAction(){ + System.out.println("View File Playback Button Clicked"); + } + + private void viewDashboardAction(){ + System.out.println("View Dashboard Button Clicked"); + } + + private void tryProForFreeAction(){ + System.out.println("Try Pro For Free Button Clicked"); + } + + private void upgradeToProAction(){ + System.out.println("Upgrade To Pro Button Clicked"); + } + + private void openSyncIgnoreFileAction(){ + System.out.println("Open SyncIgnore File Button Clicked"); + } + + private void viewParentRepositoryOnWebAction(){ + System.out.println("View Parent Repository On Web Button Clicked"); + } + + private void unsyncParentRepositoryAction(){ + System.out.println("Unsync Parent Repository Button Clicked"); + } + + private void userNotLoggedIn(){ + this.add(loginMessage); + this.add(login); + } + + private void repositoryNotConnected(){ + this.add(connectRepoMessage); + this.add(connectRepository); + this.add(logout); + } + + private void userCanStream(){ + this.add(userCanStreamMessage); + this.add(viewFilePlayback); + this.add(viewDashboard); + this.add(disconnectRepository); + this.add(logout); + } + + private void userNeedToAvailTrail(){ + this.add(tryProForFreeMessage); + this.add(viewFilePlayback); + this.add(viewDashboard); + this.add(tryProForFree); + this.add(disconnectRepository); + this.add(logout); + } + + private void userNeedToUpgradeToPro(){ + this.add(upgradeToProMessage); + this.add(viewFilePlayback); + this.add(viewDashboard); + this.add(upgradeToPro); + this.add(disconnectRepository); + this.add(logout); + } + + private void syncIgnoredNestedDirOpen(){ + this.add(nestedIgnoredDirMessage); + this.add(openSyncIgnoreFile); + this.add(viewParentRepositoryOnWeb); + this.add(unsyncParentRepository); + } + + private void nestedDirOpen(){ + this.add(nestedDirMessage); + this.add(viewParentRepositoryOnWeb); + this.add(unsyncParentRepository); + } + } diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncButton.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncButton.java index 6c022d94..dffafd22 100644 --- a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncButton.java +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncButton.java @@ -12,4 +12,4 @@ public CodeSyncButton(String buttonText){ this.setMaximumSize(dimension); } -} +} \ No newline at end of file diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncLabel.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncLabel.java new file mode 100644 index 00000000..3966b9e3 --- /dev/null +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncLabel.java @@ -0,0 +1,15 @@ +package org.intellij.sdk.codesync.toolWindow; + +import javax.swing.*; +import java.awt.*; + +public class CodeSyncLabel extends JLabel { + + public CodeSyncLabel(String labelText){ + super("

" + labelText + "

"); + this.setBackground(Color.GREEN); + this.setAlignmentX(Component.CENTER_ALIGNMENT); + this.setPreferredSize(new Dimension(200, this.getPreferredSize().height+20)); + } + +} diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncMenu.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncMenu.java index c1873daa..55442616 100644 --- a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncMenu.java +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncMenu.java @@ -9,7 +9,6 @@ public class CodeSyncMenu extends JPanel { JPanel controlsPanel = new JPanel(); controlsPanel.setLayout(new GridBagLayout()); controlsPanel.add(new ButtonList()); - this.add(controlsPanel); } diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java index 80ea5390..7e6c6a4e 100644 --- a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java @@ -1,30 +1,33 @@ package org.intellij.sdk.codesync.toolWindow; -import org.jetbrains.annotations.NotNull; - import javax.swing.*; import java.awt.*; public class CodeSyncToolWindow extends JPanel { - private final JPanel contentPanel = new JPanel(); - private final JPanel leftPanel = new JPanel(); - private final JPanel rightPanel = new JPanel(); + private static JPanel contentPanel = new JPanel(); + private static JPanel rightPanel = new JPanel(); + private static JPanel leftPanel = new JPanel(); public CodeSyncToolWindow() { contentPanel.setLayout(new BorderLayout(0, 20)); contentPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - leftPanel.setLayout(new BorderLayout()); rightPanel.setLayout(new BorderLayout()); + leftPanel.setLayout(new BorderLayout()); - leftPanel.setPreferredSize(new Dimension((int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.8), 0)); - rightPanel.setPreferredSize(new Dimension((int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.2), 0)); + rightPanel.setPreferredSize(new Dimension((int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.8), 0)); + leftPanel.setPreferredSize(new Dimension((int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.2), 0)); - contentPanel.add(leftPanel, BorderLayout.CENTER); - contentPanel.add(rightPanel, BorderLayout.WEST); + contentPanel.add(rightPanel, BorderLayout.CENTER); + contentPanel.add(leftPanel, BorderLayout.WEST); + + leftPanel.add(new CodeSyncMenu(), BorderLayout.CENTER); + } - rightPanel.add(new CodeSyncMenu(), BorderLayout.CENTER); + public static void updateMenu(){ + leftPanel.removeAll(); + leftPanel.add(new CodeSyncMenu(), BorderLayout.CENTER); } public JPanel getContentPanel() { diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 03ca9aed..75b086b4 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -76,6 +76,6 @@ + doNotActivateOnStart="true" factoryClass="org.intellij.sdk.codesync.toolWindow.CodeSyncToolWindowButton"/> From b9f119cf1b538d3f90a14dc5151d02122c10fa08 Mon Sep 17 00:00:00 2001 From: Gul Ahmed Date: Tue, 25 Jul 2023 10:03:12 +0500 Subject: [PATCH 10/12] Resolved UI not updating using event messaging. --- .../codesync/eventBus/CodeSyncEventBus.java | 9 +++++++++ .../sdk/codesync/toolWindow/ButtonList.java | 9 +++------ .../toolWindow/CodeSyncToolWindow.java | 7 +++++++ .../toolWindow/CodeSyncToolWindowButton.java | 18 +++++++++++++++++- 4 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/intellij/sdk/codesync/eventBus/CodeSyncEventBus.java diff --git a/src/main/java/org/intellij/sdk/codesync/eventBus/CodeSyncEventBus.java b/src/main/java/org/intellij/sdk/codesync/eventBus/CodeSyncEventBus.java new file mode 100644 index 00000000..d836449f --- /dev/null +++ b/src/main/java/org/intellij/sdk/codesync/eventBus/CodeSyncEventBus.java @@ -0,0 +1,9 @@ +package org.intellij.sdk.codesync.eventBus; + +import com.intellij.util.messages.Topic; + +public interface CodeSyncEventBus { + Topic TOPIC = Topic.create("CodeSyncEventBus", CodeSyncEventBus.class); + + void onEvent(); // Define your event method here +} diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java index 76685552..eaa62f54 100644 --- a/src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java @@ -1,6 +1,7 @@ package org.intellij.sdk.codesync.toolWindow; import com.intellij.openapi.project.Project; +import com.intellij.util.messages.MessageBus; import org.intellij.sdk.codesync.state.PluginState; import org.intellij.sdk.codesync.state.StateUtils; import org.intellij.sdk.codesync.utils.CommonUtils; @@ -13,7 +14,7 @@ public class ButtonList extends JPanel { static boolean userLoggedIn = false; static boolean repoConnected = false; - static boolean needToAvailTrail = false; + static boolean needToAvailTrail = true; static boolean needToUpgradeToPro = false; static boolean isNestedRepo = false; static boolean isIgnoredNestedRepo = true; @@ -21,7 +22,7 @@ public class ButtonList extends JPanel { CodeSyncLabel loginMessage = new CodeSyncLabel("Login and connect the repository to start streaming your code."); CodeSyncLabel connectRepoMessage = new CodeSyncLabel("Great! Now just connect the repository to start streaming your code."); CodeSyncLabel userCanStreamMessage = new CodeSyncLabel("Your repository is in sync."); - CodeSyncLabel tryProForFreeMessage = new CodeSyncLabel("Your repository size is exceeding the free limit. \n Try Pro for free to continue using CodeSync."); + CodeSyncLabel tryProForFreeMessage = new CodeSyncLabel("Your repository size is exceeding the free limit. \n Try Pro for free to continue using CodeSync."); CodeSyncLabel upgradeToProMessage = new CodeSyncLabel("Your free trial of CodeSync has ended. \n Please upgrade your plan to continue using CodeSync, or contact sales."); CodeSyncLabel nestedDirMessage = new CodeSyncLabel("This file is ignored by .syncignore and is not in sync with CodeSync."); CodeSyncLabel nestedIgnoredDirMessage = new CodeSyncLabel("Current directory is ignored by a parent directory for streaming. \n To include this directory/file, remove it from the .syncignore file."); @@ -41,10 +42,6 @@ public class ButtonList extends JPanel { public ButtonList(){ this.addingActionListeners(); - paint(); - } - - private void paint(){ this.removeAll(); this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java index 7e6c6a4e..1f0298ba 100644 --- a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java @@ -1,5 +1,9 @@ package org.intellij.sdk.codesync.toolWindow; +import com.intellij.util.messages.MessageBus; +import org.intellij.sdk.codesync.eventBus.CodeSyncEventBus; +import org.intellij.sdk.codesync.utils.CommonUtils; + import javax.swing.*; import java.awt.*; @@ -28,6 +32,9 @@ public CodeSyncToolWindow() { public static void updateMenu(){ leftPanel.removeAll(); leftPanel.add(new CodeSyncMenu(), BorderLayout.CENTER); + MessageBus messageBus = CommonUtils.getCurrentProject().getMessageBus(); + CodeSyncEventBus eventBus = messageBus.syncPublisher(CodeSyncEventBus.TOPIC); + eventBus.onEvent(); // Notify subscribers about the event } public JPanel getContentPanel() { diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindowButton.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindowButton.java index d9d3e259..b11cac97 100644 --- a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindowButton.java +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindowButton.java @@ -6,15 +6,31 @@ import com.intellij.openapi.wm.ToolWindowFactory; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentFactory; +import org.intellij.sdk.codesync.eventBus.CodeSyncEventBus; import org.jetbrains.annotations.NotNull; +import javax.swing.*; + public class CodeSyncToolWindowButton implements ToolWindowFactory, DumbAware { + CodeSyncToolWindow toolWindowContent; + @Override public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) { - CodeSyncToolWindow toolWindowContent = new CodeSyncToolWindow(); + toolWindowContent = new CodeSyncToolWindow(); Content content = ContentFactory.SERVICE.getInstance().createContent(toolWindowContent.getContentPanel(), "", false); toolWindow.getContentManager().addContent(content); toolWindow.setSplitMode(false, null); + + // Register a listener to update the content whenever the event occurs + project.getMessageBus().connect().subscribe(CodeSyncEventBus.TOPIC, () -> { + SwingUtilities.invokeLater(() -> { + // Perform any updates or changes to the CodeSyncToolWindow content here + // Repaint the content panel to reflect the changes + toolWindowContent.getContentPanel().revalidate(); + toolWindowContent.getContentPanel().repaint(); + }); + }); + } } From 646b644cb7361d112ad204d90cd7f469cca689e4 Mon Sep 17 00:00:00 2001 From: Gul Ahmed Date: Thu, 27 Jul 2023 12:21:04 +0500 Subject: [PATCH 11/12] Made changes to layout --- .../sdk/codesync/toolWindow/ButtonList.java | 20 ++++++++++--------- .../codesync/toolWindow/CodeSyncButton.java | 3 --- .../codesync/toolWindow/CodeSyncLabel.java | 2 -- .../toolWindow/CodeSyncToolWindow.java | 15 ++++++++------ .../toolWindow/CodeSyncToolWindowButton.java | 5 ++--- 5 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java index eaa62f54..7b6d4987 100644 --- a/src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java @@ -14,19 +14,21 @@ public class ButtonList extends JPanel { static boolean userLoggedIn = false; static boolean repoConnected = false; - static boolean needToAvailTrail = true; - static boolean needToUpgradeToPro = false; + static boolean needToAvailTrail = false; + static boolean needToUpgradeToPro = true; static boolean isNestedRepo = false; static boolean isIgnoredNestedRepo = true; CodeSyncLabel loginMessage = new CodeSyncLabel("Login and connect the repository to start streaming your code."); CodeSyncLabel connectRepoMessage = new CodeSyncLabel("Great! Now just connect the repository to start streaming your code."); CodeSyncLabel userCanStreamMessage = new CodeSyncLabel("Your repository is in sync."); - CodeSyncLabel tryProForFreeMessage = new CodeSyncLabel("Your repository size is exceeding the free limit. \n Try Pro for free to continue using CodeSync."); - CodeSyncLabel upgradeToProMessage = new CodeSyncLabel("Your free trial of CodeSync has ended. \n Please upgrade your plan to continue using CodeSync, or contact sales."); + CodeSyncLabel tryProForFreeMessage = new CodeSyncLabel("Your repository size is exceeding the free limit."); + CodeSyncLabel tryProForFreeMessage2 = new CodeSyncLabel("Try Pro for free to continue using CodeSync."); + CodeSyncLabel upgradeToProMessage = new CodeSyncLabel("Your free trial of CodeSync has ended."); + CodeSyncLabel upgradeToProMessage2 = new CodeSyncLabel("Please upgrade your plan to continue using CodeSync, or contact sales."); CodeSyncLabel nestedDirMessage = new CodeSyncLabel("This file is ignored by .syncignore and is not in sync with CodeSync."); - CodeSyncLabel nestedIgnoredDirMessage = new CodeSyncLabel("Current directory is ignored by a parent directory for streaming. \n To include this directory/file, remove it from the .syncignore file."); - + CodeSyncLabel nestedIgnoredDirMessage = new CodeSyncLabel("Current directory is ignored by a parent directory for streaming."); + CodeSyncLabel nestedIgnoredDirMessage2 = new CodeSyncLabel("To include this directory/file, remove it from the .syncignore file."); CodeSyncButton login = new CodeSyncButton("Login"); CodeSyncButton logout = new CodeSyncButton("Logout"); @@ -43,7 +45,6 @@ public class ButtonList extends JPanel { public ButtonList(){ this.addingActionListeners(); this.removeAll(); - this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); Project project = CommonUtils.getCurrentProject(); String repoPath = ProjectUtils.getRepoPath(project); @@ -67,8 +68,6 @@ public ButtonList(){ }else { userCanStream(); } - - this.setAlignmentX(Component.CENTER_ALIGNMENT); } private void addingActionListeners(){ @@ -158,6 +157,7 @@ private void userCanStream(){ private void userNeedToAvailTrail(){ this.add(tryProForFreeMessage); + this.add(tryProForFreeMessage2); this.add(viewFilePlayback); this.add(viewDashboard); this.add(tryProForFree); @@ -167,6 +167,7 @@ private void userNeedToAvailTrail(){ private void userNeedToUpgradeToPro(){ this.add(upgradeToProMessage); + this.add(upgradeToProMessage2); this.add(viewFilePlayback); this.add(viewDashboard); this.add(upgradeToPro); @@ -176,6 +177,7 @@ private void userNeedToUpgradeToPro(){ private void syncIgnoredNestedDirOpen(){ this.add(nestedIgnoredDirMessage); + this.add(nestedIgnoredDirMessage2); this.add(openSyncIgnoreFile); this.add(viewParentRepositoryOnWeb); this.add(unsyncParentRepository); diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncButton.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncButton.java index dffafd22..945bf90b 100644 --- a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncButton.java +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncButton.java @@ -7,9 +7,6 @@ public class CodeSyncButton extends JButton { public CodeSyncButton(String buttonText){ super(buttonText); - this.setAlignmentX(Component.CENTER_ALIGNMENT); - Dimension dimension = new Dimension(200, 50); - this.setMaximumSize(dimension); } } \ No newline at end of file diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncLabel.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncLabel.java index 3966b9e3..4d0c08d9 100644 --- a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncLabel.java +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncLabel.java @@ -8,8 +8,6 @@ public class CodeSyncLabel extends JLabel { public CodeSyncLabel(String labelText){ super("

" + labelText + "

"); this.setBackground(Color.GREEN); - this.setAlignmentX(Component.CENTER_ALIGNMENT); - this.setPreferredSize(new Dimension(200, this.getPreferredSize().height+20)); } } diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java index 1f0298ba..757eb1c7 100644 --- a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java @@ -7,26 +7,28 @@ import javax.swing.*; import java.awt.*; -public class CodeSyncToolWindow extends JPanel { +public class CodeSyncToolWindow { private static JPanel contentPanel = new JPanel(); private static JPanel rightPanel = new JPanel(); private static JPanel leftPanel = new JPanel(); - public CodeSyncToolWindow() { + public static void createToolWindow() { contentPanel.setLayout(new BorderLayout(0, 20)); contentPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); rightPanel.setLayout(new BorderLayout()); leftPanel.setLayout(new BorderLayout()); - rightPanel.setPreferredSize(new Dimension((int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.8), 0)); - leftPanel.setPreferredSize(new Dimension((int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.2), 0)); + rightPanel.setPreferredSize(new Dimension((int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.7), 0)); + leftPanel.setPreferredSize(new Dimension((int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.3), 0)); + + rightPanel.setBackground(Color.PINK); contentPanel.add(rightPanel, BorderLayout.CENTER); contentPanel.add(leftPanel, BorderLayout.WEST); - leftPanel.add(new CodeSyncMenu(), BorderLayout.CENTER); + leftPanel.add(new ButtonList(), BorderLayout.CENTER); } public static void updateMenu(){ @@ -37,7 +39,8 @@ public static void updateMenu(){ eventBus.onEvent(); // Notify subscribers about the event } - public JPanel getContentPanel() { + public static JPanel getContentPanel() { + createToolWindow(); return contentPanel; } } diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindowButton.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindowButton.java index b11cac97..96544177 100644 --- a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindowButton.java +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindowButton.java @@ -10,6 +10,7 @@ import org.jetbrains.annotations.NotNull; import javax.swing.*; +import java.awt.*; public class CodeSyncToolWindowButton implements ToolWindowFactory, DumbAware { @@ -17,8 +18,7 @@ public class CodeSyncToolWindowButton implements ToolWindowFactory, DumbAware { @Override public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) { - toolWindowContent = new CodeSyncToolWindow(); - Content content = ContentFactory.SERVICE.getInstance().createContent(toolWindowContent.getContentPanel(), "", false); + Content content = ContentFactory.SERVICE.getInstance().createContent(CodeSyncToolWindow.getContentPanel(), "", false); toolWindow.getContentManager().addContent(content); toolWindow.setSplitMode(false, null); @@ -31,6 +31,5 @@ public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindo toolWindowContent.getContentPanel().repaint(); }); }); - } } From 421ba239f3c82d9f19c12b381cb80c472e31c944 Mon Sep 17 00:00:00 2001 From: Gul Ahmed Date: Mon, 7 Aug 2023 12:33:32 +0500 Subject: [PATCH 12/12] Improved layout, need to center components horizontally --- .../sdk/codesync/toolWindow/ButtonList.java | 5 +++ .../codesync/toolWindow/CodeSyncButton.java | 2 + .../toolWindow/CodeSyncToolWindow.java | 3 +- .../sdk/codesync/toolWindow/RightSide.java | 35 ++++++++++++++++++ src/main/resources/icons/codesync.png | Bin 0 -> 2190 bytes 5 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/intellij/sdk/codesync/toolWindow/RightSide.java create mode 100644 src/main/resources/icons/codesync.png diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java index 7b6d4987..3dedb61c 100644 --- a/src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/ButtonList.java @@ -51,6 +51,10 @@ public ButtonList(){ PluginState pluginState = StateUtils.getState(repoPath); PluginState globalState = StateUtils.getGlobalState(); + setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); + setAlignmentX(Component.CENTER_ALIGNMENT); + + add(Box.createVerticalGlue()); if(!userLoggedIn){ //Replace it with !globalState.isAuthenticated userNotLoggedIn(); }else if(isNestedRepo){ @@ -68,6 +72,7 @@ public ButtonList(){ }else { userCanStream(); } + add(Box.createVerticalGlue()); } private void addingActionListeners(){ diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncButton.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncButton.java index 945bf90b..5d2c5830 100644 --- a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncButton.java +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncButton.java @@ -7,6 +7,8 @@ public class CodeSyncButton extends JButton { public CodeSyncButton(String buttonText){ super(buttonText); + Dimension buttonSize = new Dimension(200, 50); + this.setMaximumSize(buttonSize); } } \ No newline at end of file diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java index 757eb1c7..e350c44c 100644 --- a/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/CodeSyncToolWindow.java @@ -23,11 +23,10 @@ public static void createToolWindow() { rightPanel.setPreferredSize(new Dimension((int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.7), 0)); leftPanel.setPreferredSize(new Dimension((int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.3), 0)); - rightPanel.setBackground(Color.PINK); - contentPanel.add(rightPanel, BorderLayout.CENTER); contentPanel.add(leftPanel, BorderLayout.WEST); + rightPanel.add(new RightSide()); leftPanel.add(new ButtonList(), BorderLayout.CENTER); } diff --git a/src/main/java/org/intellij/sdk/codesync/toolWindow/RightSide.java b/src/main/java/org/intellij/sdk/codesync/toolWindow/RightSide.java new file mode 100644 index 00000000..86bd72eb --- /dev/null +++ b/src/main/java/org/intellij/sdk/codesync/toolWindow/RightSide.java @@ -0,0 +1,35 @@ +package org.intellij.sdk.codesync.toolWindow; + +import javax.swing.*; +import java.util.Objects; + +public class RightSide extends JPanel { + + public RightSide(){ + + setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); + JLabel imageLabel = new JLabel(); + JLabel introText = new JLabel(); + JLabel lineOne = new JLabel(); + JLabel lineTwo = new JLabel(); + JLabel lineThree = new JLabel(); + + imageLabel.setIcon(new ImageIcon(Objects.requireNonNull(getClass().getResource("/icons/codesync.png")))); + introText.setText("CodeSync streams your code in real-time to the cloud, allowing you to review the entire history of the codebase on the web."); + lineOne.setText("• Review your coding progress every day. (What did I actually write today?!)"); + lineTwo.setText("• Align with teammates. (Never again be surprised by a Pull Request!)"); + lineThree.setText("• Or, rewind back to any point in the past. (Never again lose code you didn't commit!)"); + + add(Box.createVerticalGlue()); + add(Box.createHorizontalBox()); + this.add(imageLabel); + this.add(introText); + this.add(lineOne); + this.add(lineTwo); + this.add(lineThree); + add(Box.createHorizontalBox()); + add(Box.createVerticalGlue()); + + } + +} diff --git a/src/main/resources/icons/codesync.png b/src/main/resources/icons/codesync.png new file mode 100644 index 0000000000000000000000000000000000000000..0616b20280b1c28afeb768d1c361187d387ca52f GIT binary patch literal 2190 zcmZvdcQo7GAIHD31(ni4(O4xY5>zUp#CR%{qDHAzF&-*b%vw>k39%`vYIP7PHLJ8X zeNfb_SxSf4rA9sR{P#QOckX?E?z!*tdf#*I=bulUk>PbN@C7gc09;sIZ4>&bK$j33 z3%#y%sGk^2E*Jw008mLG2gYgiyD(1I!~g(dxB(!Mt|K}Vp#cD)K>+YA0RYfT0Kor& zfQ|~Fvn&q!*R_G;lU3MUc9LfI(zPT2fSlNgK!GLd{&bVo7i*xyy3EGP!XkCwg4#%T zjIi1m)7x#Yv+;@6X8c{@$Atb59#hPkO-lw5wd~?7r+L_;vtucP5JnOz|Up zJa+LP0q95y9}jF(B95;Fqa<-bT{sTPhB%!7)fR?5@l6=lbY+a9`7al2?Y1=s_&fWT zP4lSqynI6u z?r*(W1Tdzi6AMmwRdNs}Z*6$0M&4jkTP@pTT1HSV#VB6$4U zn`?kJRN~=+pl1C*M$7l!iHt~@Ve1STNsF1Uwhc28E3nwjT$g}vFbGn3deS{{rZT2a zs7LB>D5FJJw(O&>_*|LvWD)x%a89h$=)1L$;p@b`#^T49silv8;JK$bQnTFJh@*!) zQHiojHTRf#Aps35C<7RV5hU78$!{VFWxau6$DM%%xAsuYsQEm;qmY*X&<=qc=~)t~ z+>$Qm(Z#c)bJKE5D1%OIe=hQAP>Vlp|Jp-w0aR^ptJz@8;7V?-i}o($S zcD`B@@0Z2ixHv0i6*2bwz45Kcv(J-8T8M<9-0ZC%ItMpP_q5_92fPK49M5K80mO^z zLH11}F@IyEg(v>lD7suUqK3{t{gK7&)3@D*TK_5%Uwtz#cmFzgDfV%yp<6zs1 zC5n9vL2hG)<~RS@_}tfo6)|!D^)`&yOo7fF`U#AC^*$4K$-L20g<3!=YI`5Ag2vJ$ zPG_Xx%UBlDTD1&TEEyIsQ+8mHZvT{@sIpA?3bQocmn;53&H*CP8cdB+#@2yfOZZDA zEK0KrMnOhT>4D^J|xjGwylp{|ibyE>5r`CZg0k(~WvT3Z4Nn$%Bb5lVgIc?Nl z;~YClT#6JiF5#-b^|oqo!lnfV1Xo$;9uhl_I{vA>HcEtbt{BGSFhsPu)ph=edA>&P zLuD-TGBb5!2Jkb}@@IOB53VbodZzF5<1Wamfx(aWXS+5yg72?gO4#G>%BitU(N`m0 ztB*WWeF=5*A-q86)UDCOe3C7w1#INQry7+2CIePB_LX}ezBy%8) z7>vso)0fG=(sNi4$#K+VoHi@%d#wt5pZ+*gVh2ln<>QuB=RtNU21MX zgH;MQdzFuRM)Y7dB$C&>LQtjxVz@e_5`O8!S@az*r}QN0G3Pt)arM^v&y)fPE&Pm_ zTczrZ=m#U@k$Z;e%-PH}_&$s~VP>D}aQ|^Kve|JX7i$7{EbC# z&^Lohx+0QXdPN+nVP$qa=+fwBO7(weQ@1W&<0Tk#?V~*QwPS0BK=ucZ!{!;TB z`;!UEem-((ZObiECxIcPz0g3!nJxGsK4i$qcHS`B^U++`orM*$WL zQxT+MTQS976{>B?;d`@-sZL%}I?;jkNV^UQO~JZvVMg&099B+ZC^Q4TE3O{k)$H>5 zQg!uCCnkis#-?caoB#dh-?q>Nd1z?CLJ{8s!V$86=e`-zkEUb`e*YkQ@{9-Xa6@=J ztZ)0b?&UUa=y%1@E2&|Ip^xp%%u1ui1ACWrO-y~|ER97j(srJE=uL5sx!x`sM3*4k z$0ltQ`L_+xAVEPqWiPr|)hbp(Z?cZY$%x*F%YR>=C4&VwTRUOvaJ6t2hI&;dd{`OC z{)xqBFL5>^2h?Wmx#N;axn6&MHZ4}fJq}@th(3cWY|u*->4eZ$OKTc>Rchy({2(efc93^0rvpj(+zul3W-ZX03=+hu(_)10}e#Nxo~BSEr9# z5nr9#zFIy`cYR$wJ%mkN@lJpOTmgZCE1?hwVFVJTq=-VOya=5tqr;a@V8^?@PAJ?- z;y+YT7JgM0jx>cUqyF16a5xGM=gz8G_@4mY)6vyA=;ZDH9|-H^w510Ctd5~}rKbIZ Fe*r~{<%j?P literal 0 HcmV?d00001