Skip to content

Instantly share code, notes, and snippets.

@dulimarta
Created November 13, 2015 07:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dulimarta/ac063e929f3ad729b213 to your computer and use it in GitHub Desktop.
Save dulimarta/ac063e929f3ad729b213 to your computer and use it in GitHub Desktop.
GUI files for ScrambledText Part B
package cis163.text_scrambler.ui;
import cis163.text_scrambler.GVList;
import cis163.text_scrambler.Scrambler;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
/**
* Created by Hans Dulimarta (Fall 2015).
*/
public class STGUI {
private JFrame top;
private TextPanel userInput, formattedOutput, scrambledText, recoveredText;
private PlainDocument inputDoc;
private Timer idleTimer;
private Scrambler wordArranger;
private JSpinner widthControl;
private int idleCount;
public STGUI() {
top = new JFrame();
inputDoc = new PlainDocument();
idleTimer = new Timer(500, timerObserver);
/** TODO Replace XYZ with your own class that implements the Scrambler interface */
// wordArranger = new XYZ();
inputDoc.addDocumentListener(docObserver);
userInput = new TextPanel(inputDoc, "Input");
userInput.append("Left side");
formattedOutput = new TextPanel(null, "Formatted");
scrambledText = new TextPanel(null, "Scrambled");
recoveredText = new TextPanel(null, "Unscrambled");
JPanel pan = new JPanel(new GridLayout(2, 0));
pan.add(userInput);
pan.add(formattedOutput);
pan.add(recoveredText);
pan.add(scrambledText);
SpinnerNumberModel numericSpin = new SpinnerNumberModel(40, 20, 50, 1);
widthControl = new JSpinner(numericSpin);
widthControl.addChangeListener(spinnerObserver);
JPanel northPan = new JPanel();
northPan.setLayout(new FlowLayout(FlowLayout.RIGHT));
northPan.add(new JLabel("Column width"));
northPan.add(widthControl);
top.add(northPan, BorderLayout.NORTH);
top.add(pan, BorderLayout.CENTER);
top.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
top.pack();
top.setVisible(true);
}
public static void main (String[] args) {
new STGUI();
}
private DocumentListener docObserver = new DocumentListener() {
/* Reset idelCount to zero when use is changing the text */
@Override
public void insertUpdate(DocumentEvent e) {
idleCount = 0;
idleTimer.start();
}
@Override
public void removeUpdate(DocumentEvent e) {
idleCount = 0;
idleTimer.start();
}
@Override
public void changedUpdate(DocumentEvent e) {
System.out.println("change " + e);
}
};
private void renderText (GVList<String>[] source, TextPanel dest) {
dest.clear();
StringBuffer sw = new StringBuffer();
for (int k = 0; k < source.length; k++) {
sw.setLength(0);
GVList<String> line = source[k];
line.dump(sw, " ");
dest.append(sw.toString() + "\n");
}
}
private void reformatText() {
int docLen = inputDoc.getLength();
try {
String docText = inputDoc.getText(0, docLen).replaceAll("\n"," ");
GVList<String>[] result = wordArranger.reformat(docText,
(int) widthControl.getValue());
renderText (result, formattedOutput);
GVList<String>[] scrambled = wordArranger.scramble(result);
renderText (scrambled, scrambledText);
GVList<String>[] rec = wordArranger.unscramble(scrambled);
renderText (rec, recoveredText);
} catch (BadLocationException e1) {
e1.printStackTrace();
}
}
private ActionListener timerObserver = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// if (idleCount > 0)
// System.out.println("Tick " + idleCount);
idleCount++;
if (idleCount > 3) {
idleTimer.stop();
reformatText();
}
}
};
private ChangeListener spinnerObserver = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
reformatText();
}
};
}
package cis163.text_scrambler.ui;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import javax.swing.text.PlainDocument;
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.font.FontRenderContext;
import java.awt.font.LineMetrics;
import java.awt.geom.Rectangle2D;
/**
* Created by Hans Dulimarta (Fall 2015).
*/
public class TextPanel extends JPanel {
private JTextArea content;
private JScrollPane scroller;
private static Font textFont;
private static int groupWidth;
static {
textFont = new Font("Courier", Font.PLAIN, 14);
FontRenderContext frc = new FontRenderContext(textFont.getTransform(), true, true);
Rectangle2D r = textFont.getStringBounds("1234567890", frc);
groupWidth = (int) (r.getWidth());
groupWidth -= groupWidth/20; /* subtract 5% */
}
public TextPanel(PlainDocument doc, String title) {
setLayout(new BorderLayout());
// setBorder(BorderFactory.createTitledBorder(title));
content = new JTextArea(doc, "", 10, 30);
// content.setLineWrap(true);
content.setFont(textFont);
content.setOpaque(false);
scroller = new JScrollPane();
JViewport viewport = new MyViewport();
scroller.setViewport(viewport);
viewport.setView(content);
scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
add (scroller, BorderLayout.CENTER);
setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(10,10,10,10),
BorderFactory.createTitledBorder(title)));
}
public void clear() {
content.setText("");
}
public void append (String s) {
content.append(s);
}
private class MyViewport extends JViewport {
@Override
public void paint(Graphics g) {
super.paint(g);
/* draw vertical lines in multiple of 10 characters */
g.setColor(Color.GRAY);
int pos = groupWidth;
while (pos < getWidth()) {
g.drawLine((int) pos, 0, (int) pos, getHeight());
pos += groupWidth;
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment