Created
November 13, 2015 07:11
-
-
Save dulimarta/ac063e929f3ad729b213 to your computer and use it in GitHub Desktop.
GUI files for ScrambledText Part B
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
}; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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