school/cs240/record-indexer/src/search/Main.java

252 lines
8.2 KiB
Java

package search;
import search.elements.FieldButton;
import search.elements.ProjectGroup;
import search.forms.InputField;
import search.helpers.Networking;
import search.helpers.dataModels.ProjectContainer;
import shared.communication.common.Fields;
import shared.communication.common.Tuple;
import shared.communication.responses.Search_Res;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.ByteArrayOutputStream;
import java.util.HashSet;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Set;
public class Main extends JFrame {
private JPanel menuPanel;
private JPanel sidebarPanel;
private JPanel mainBody;
private JPanel searchResults;
private JSplitPane searchArea;
private JSplitPane searchForm;
public Main() {
this.setTitle("Search Program");
this.setSize(800, 650);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setupMenu();
setupSidebar();
setupBody();
setupSearchResults();
searchArea = new JSplitPane(JSplitPane.VERTICAL_SPLIT, mainBody, new JScrollPane());
searchArea.setOneTouchExpandable(false);
searchArea.setEnabled(false);
searchArea.setDividerLocation(80);
searchArea.setDividerSize(0);
searchForm = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sidebarPanel, searchArea);
searchForm.setOneTouchExpandable(false);
searchForm.setDividerLocation(120);
searchForm.setEnabled(false);
searchForm.setDividerSize(1);
searchForm.setPreferredSize(new Dimension(120, 500));
JSplitPane jSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, menuPanel, searchForm);
jSplitPane.setOneTouchExpandable(false);
jSplitPane.setDividerLocation(40);
jSplitPane.setDividerSize(1);
jSplitPane.setEnabled(false);
this.add(jSplitPane);
this.setVisible(true);
}
private final InputField usernameField = new InputField("Username", 15);
private final JTextField passwordField = new JTextField("Password", 15);
private final JTextField hostField = new JTextField("localhost", 7);
private final JTextField portField = new JTextField("39640", 4);
private void setupMenu() {
// Add buttons
FlowLayout flowLayout = new FlowLayout();
final JPanel jPanel = new JPanel();
jPanel.setLayout(flowLayout);
flowLayout.setAlignment(FlowLayout.LEFT);
JButton button = new JButton("Get Projects");
jPanel.add(hostField);
jPanel.add(portField);
jPanel.add(usernameField);
jPanel.add(passwordField);
jPanel.add(button);
jPanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Networking networking = new Networking(
hostField.getText(), Integer.parseInt(portField.getText()));
String username = usernameField.getText();
String password = passwordField.getText();
List<ProjectContainer> projectContainerList =
networking.getProjectsWithFields(username, password);
JPanel search = new JPanel();
if(projectContainerList != null)
for(ProjectContainer projectContainer : projectContainerList) {
search.add(new ProjectGroup(projectContainer));
for(final Fields field : projectContainer.getFieldsList()) {
FieldButton fieldButton = new FieldButton(field);
fieldButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String fieldId = Integer.toString(field.getId());
updateFieldsField(fieldId);
}
});
search.add(fieldButton);
}
}
searchForm.setLeftComponent(search);
searchForm.setDividerLocation(120);
searchForm.validate();
searchForm.repaint();
String fieldName = "";
if(projectContainerList != null)
fieldName = projectContainerList.get(0).getFieldsList().get(0).getTitle();
System.out.println(fieldName);
}
});
menuPanel = jPanel;
}
private void setupSidebar() {
final JPanel jPanel = new JPanel();
jPanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
sidebarPanel = jPanel;
}
private final JTextField fieldsField = new JTextField("",48);
private void updateFieldsField(String fieldId) {
String text = fieldsField.getText();
String[] options = text.split(",");
if(options.length > 0 && !text.isEmpty())
text += ",";
fieldsField.setText(text + fieldId);
}
private void setupBody() {
final JPanel jPanel = new JPanel();
jPanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
final JButton searchButton = new JButton("Search");
final JTextField queryField = new JTextField("",41);
jPanel.add(new JLabel("Fields: "));
jPanel.add(fieldsField);
jPanel.add(new JLabel("Terms: "));
jPanel.add(queryField);
jPanel.add(searchButton);
searchButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JPanel results = new JPanel();
Networking networking = new Networking(
hostField.getText(), Integer.parseInt(portField.getText()));
searchResults.setVisible(false);
String username = usernameField.getText();
String password = passwordField.getText();
Search_Res searchRes = networking.search(username,password,
fieldsField.getText(), queryField.getText());
if(searchRes != null)
for(Tuple searchResult : searchRes.getSearchResults()) {
String imageUrl = searchResult.getImageUrl();
final BufferedImage image = networking.getImage(imageUrl);
if(image == null) return;
BufferedImage scaledImage = resize(image, 200, 150);
JLabel imageLabel = new JLabel(new ImageIcon(scaledImage));
imageLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
JFrame frame2 = new JFrame();
JLabel bigImage = new JLabel(new ImageIcon(image));
frame2.add(bigImage);
frame2.setSize(bigImage.getPreferredSize());
frame2.setVisible(true);
}
});
imageLabel.setPreferredSize(new Dimension(200, 150));
results.add(imageLabel);
}
JScrollPane scrollPane = new JScrollPane();
results.setPreferredSize(new Dimension(600, 2000));
scrollPane.getViewport().add(results);
searchArea.setRightComponent(scrollPane);
searchArea.validate();
searchArea.setDividerLocation(80);
searchArea.repaint();
}
});
mainBody = jPanel;
}
private void setupSearchResults() {
JPanel jPanel = new JPanel();
searchResults = jPanel;
}
public BufferedImage resize(BufferedImage image, int width, int height) {
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TRANSLUCENT);
Graphics2D g2d = (Graphics2D) bi.createGraphics();
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
g2d.drawImage(image, 0, 0, width, height, null);
g2d.dispose();
return bi;
}
}