mirror of
https://github.com/macocianradu/javaGUItoolkit.git
synced 2026-03-18 13:40:04 +00:00
added decorations package
made framework for text aligners
This commit is contained in:
@@ -9,8 +9,9 @@
|
|||||||
Size="1.0f, 1.0f"
|
Size="1.0f, 1.0f"
|
||||||
Name="Main Grid">
|
Name="Main Grid">
|
||||||
<Text
|
<Text
|
||||||
Text="Ioana"
|
Text="Ioana E Cea Mai Tare"
|
||||||
Name="Text"
|
Name="Text"
|
||||||
|
Alignment="Right"
|
||||||
Row="0"
|
Row="0"
|
||||||
Column="0"/>
|
Column="0"/>
|
||||||
<Panel
|
<Panel
|
||||||
@@ -45,7 +46,8 @@
|
|||||||
AccentColor="#aaaaaa"
|
AccentColor="#aaaaaa"
|
||||||
ForegroundColor="#ffffff"
|
ForegroundColor="#ffffff"
|
||||||
Location="0.0f, 0.8f"
|
Location="0.0f, 0.8f"
|
||||||
Size="300, 60"/>
|
Size="300, 60">
|
||||||
|
</InputTextBox>>
|
||||||
|
|
||||||
<DropDown
|
<DropDown
|
||||||
BackgroundColor="#222222"
|
BackgroundColor="#222222"
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
package guiTree.Components;
|
package guiTree.Components.Decoarations;
|
||||||
|
|
||||||
import guiTree.Visual;
|
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
|
|
||||||
public class Border extends Visual {
|
public class Border extends Decoration {
|
||||||
private int thickness;
|
private int thickness;
|
||||||
private Color color;
|
private Color color;
|
||||||
|
|
||||||
@@ -38,16 +36,11 @@ public class Border extends Visual {
|
|||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInside(int x, int y) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void paint(BufferedImage imageBuffer) {
|
public void paint(BufferedImage imageBuffer) {
|
||||||
Graphics2D g = imageBuffer.createGraphics();
|
Graphics2D g = imageBuffer.createGraphics();
|
||||||
|
|
||||||
g.setColor(color);
|
g.setColor(color);
|
||||||
g.setStroke(new BasicStroke(thickness));
|
g.setStroke(new BasicStroke(thickness));
|
||||||
g.drawRect(0, 0, getWidth(), getHeight());
|
g.drawRect(thickness/2, thickness/2, getWidth() - thickness, getHeight() - thickness);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
10
src/guiTree/Components/Decoarations/Decoration.java
Normal file
10
src/guiTree/Components/Decoarations/Decoration.java
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package guiTree.Components.Decoarations;
|
||||||
|
|
||||||
|
import guiTree.Visual;
|
||||||
|
|
||||||
|
public class Decoration extends Visual {
|
||||||
|
@Override
|
||||||
|
public final boolean isInside(int x, int y) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
79
src/guiTree/Components/Decoarations/LeftTextAligner.java
Normal file
79
src/guiTree/Components/Decoarations/LeftTextAligner.java
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
package guiTree.Components.Decoarations;
|
||||||
|
|
||||||
|
import guiTree.Helper.Point2;
|
||||||
|
import jdk.jfr.Percentage;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class LeftTextAligner implements TextAligner{
|
||||||
|
private int spacing;
|
||||||
|
private FontMetrics fontMetrics;
|
||||||
|
private List<String> wholeText;
|
||||||
|
private int textHeight;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Point2<Integer> alignLine(String text, int line) {
|
||||||
|
int x = 0;
|
||||||
|
int y = (line + 1) * textHeight;
|
||||||
|
y += spacing * line;
|
||||||
|
return new Point2<>(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Point2<Integer> getPositionOnScreen(int x, int y){
|
||||||
|
String currentLine = wholeText.get(y);
|
||||||
|
y = (fontMetrics.getHeight() + spacing) * y;
|
||||||
|
int width = 0;
|
||||||
|
for(int i = 1; i <= currentLine.length(); i++) {
|
||||||
|
width += fontMetrics.charWidth(currentLine.charAt(i - 1));
|
||||||
|
if(x == i) {
|
||||||
|
return new Point2<>(width, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new Point2<>(0, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Point2<Integer> getCaretPosition(int x, int y) {
|
||||||
|
y -= wholeText.size() * spacing;
|
||||||
|
y /= fontMetrics.getHeight();
|
||||||
|
if(y > wholeText.size() - 1) {
|
||||||
|
return new Point2<>(wholeText.get(wholeText.size() - 1).length(), wholeText.size() - 1);
|
||||||
|
}
|
||||||
|
if(y < 0) {
|
||||||
|
return new Point2<>(0, 0);
|
||||||
|
}
|
||||||
|
String currentLine = wholeText.get(y);
|
||||||
|
for(int i = 0; i < currentLine.length(); i++) {
|
||||||
|
if(x < fontMetrics.charWidth(currentLine.charAt(i)) / 2) {
|
||||||
|
return new Point2<>(i, y);
|
||||||
|
}
|
||||||
|
x -= fontMetrics.charWidth(currentLine.charAt(i));
|
||||||
|
}
|
||||||
|
return new Point2<>(currentLine.length(), y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWholeText(List<StringBuilder> text) {
|
||||||
|
wholeText = new ArrayList<>();
|
||||||
|
for(StringBuilder line: text) {
|
||||||
|
wholeText.add(line.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setSpacing(int spacing) {
|
||||||
|
this.spacing = spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFontMetrics(FontMetrics fontMetrics) {
|
||||||
|
this.fontMetrics = fontMetrics;
|
||||||
|
textHeight = fontMetrics.getHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setSize(int width, int height) {
|
||||||
|
}
|
||||||
|
}
|
||||||
83
src/guiTree/Components/Decoarations/RightTextAligner.java
Normal file
83
src/guiTree/Components/Decoarations/RightTextAligner.java
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
package guiTree.Components.Decoarations;
|
||||||
|
|
||||||
|
import guiTree.Helper.Point2;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class RightTextAligner implements TextAligner{
|
||||||
|
private int spacing;
|
||||||
|
private FontMetrics fontMetrics;
|
||||||
|
private List<String> wholeText;
|
||||||
|
private int textHeight;
|
||||||
|
private int width;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Point2<Integer> alignLine(String text, int line) {
|
||||||
|
int x = width - fontMetrics.stringWidth(text);
|
||||||
|
int y = (line + 1) * textHeight;
|
||||||
|
y += spacing * line;
|
||||||
|
return new Point2<>(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Point2<Integer> getCaretPosition(int x, int y) {
|
||||||
|
y -= wholeText.size() * spacing;
|
||||||
|
y /= fontMetrics.getHeight();
|
||||||
|
if(y > wholeText.size() - 1) {
|
||||||
|
return new Point2<>(wholeText.get(wholeText.size() - 1).length(), wholeText.size() - 1);
|
||||||
|
}
|
||||||
|
if(y < 0) {
|
||||||
|
return new Point2<>(0, 0);
|
||||||
|
}
|
||||||
|
String currentLine = wholeText.get(y);
|
||||||
|
int index = currentLine.length();
|
||||||
|
for(int i = width - currentLine.length(); i < width; i++) {
|
||||||
|
if(x > width - fontMetrics.charWidth(currentLine.charAt(index - 1))) {
|
||||||
|
return new Point2<>(index, y);
|
||||||
|
}
|
||||||
|
x += fontMetrics.charWidth(currentLine.charAt(index - 1));
|
||||||
|
index--;
|
||||||
|
}
|
||||||
|
return new Point2<>(0, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Point2<Integer> getPositionOnScreen(int x, int y) {
|
||||||
|
String currentLine = wholeText.get(y);
|
||||||
|
y = (fontMetrics.getHeight() + spacing) * y;
|
||||||
|
int width = this.width;
|
||||||
|
for(int i = currentLine.length(); i > 0; i--) {
|
||||||
|
if(x == i) {
|
||||||
|
return new Point2<>(width, y);
|
||||||
|
}
|
||||||
|
width -= fontMetrics.charWidth(currentLine.charAt(i - 1));
|
||||||
|
}
|
||||||
|
return new Point2<>(this.width - fontMetrics.stringWidth(currentLine), y);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setWholeText(List<StringBuilder> wholeText) {
|
||||||
|
this.wholeText = new ArrayList<>();
|
||||||
|
for(StringBuilder line: wholeText) {
|
||||||
|
this.wholeText.add(line.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setSpacing(int spacing) {
|
||||||
|
this.spacing = spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFontMetrics(FontMetrics fontMetrics) {
|
||||||
|
this.fontMetrics = fontMetrics;
|
||||||
|
textHeight = fontMetrics.getHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setSize(int width, int height) {
|
||||||
|
this.width = width;
|
||||||
|
}
|
||||||
|
}
|
||||||
16
src/guiTree/Components/Decoarations/TextAligner.java
Normal file
16
src/guiTree/Components/Decoarations/TextAligner.java
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package guiTree.Components.Decoarations;
|
||||||
|
|
||||||
|
import guiTree.Helper.Point2;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface TextAligner {
|
||||||
|
Point2<Integer> alignLine(String text, int line);
|
||||||
|
Point2<Integer> getCaretPosition(int x, int y);
|
||||||
|
Point2<Integer> getPositionOnScreen(int x, int y);
|
||||||
|
void setWholeText(List<StringBuilder> wholeText);
|
||||||
|
void setSpacing(int spacing);
|
||||||
|
void setFontMetrics(FontMetrics fontMetrics);
|
||||||
|
void setSize(int width, int height);
|
||||||
|
}
|
||||||
@@ -125,7 +125,12 @@ public class InputTextBox extends Visual {
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
caretPosition.x --;
|
if(keyEvent.isControlDown()) {
|
||||||
|
moveCaretToNextWord(-1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
caretPosition.x--;
|
||||||
|
}
|
||||||
if(!keyEvent.isShiftDown()) {
|
if(!keyEvent.isShiftDown()) {
|
||||||
startDragPosition = new Point2<>(caretPosition);
|
startDragPosition = new Point2<>(caretPosition);
|
||||||
}
|
}
|
||||||
@@ -148,7 +153,12 @@ public class InputTextBox extends Visual {
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
caretPosition.x ++;
|
if(keyEvent.isControlDown()) {
|
||||||
|
moveCaretToNextWord(1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
caretPosition.x++;
|
||||||
|
}
|
||||||
if(!keyEvent.isShiftDown()) {
|
if(!keyEvent.isShiftDown()) {
|
||||||
startDragPosition = new Point2<>(caretPosition);
|
startDragPosition = new Point2<>(caretPosition);
|
||||||
}
|
}
|
||||||
@@ -311,6 +321,46 @@ public class InputTextBox extends Visual {
|
|||||||
return new Point2<>(currentLine.length(), y);
|
return new Point2<>(currentLine.length(), y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void moveCaretToNextWord(int direction) {
|
||||||
|
if(direction > 0) {
|
||||||
|
if (lines.get(caretPosition.y).length() == caretPosition.x) {
|
||||||
|
if (lines.size() > caretPosition.y + 1) {
|
||||||
|
caretPosition.y++;
|
||||||
|
caretPosition.x = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (caretPosition.x == 0) {
|
||||||
|
if (caretPosition.y > 0) {
|
||||||
|
caretPosition.y--;
|
||||||
|
caretPosition.x = lines.get(caretPosition.y).length();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
StringBuilder currentLine = lines.get(caretPosition.y);
|
||||||
|
char currentChar;
|
||||||
|
currentChar = currentLine.charAt(caretPosition.x + direction);
|
||||||
|
while(currentChar == ' ' ){
|
||||||
|
caretPosition.x += direction;
|
||||||
|
currentChar = currentLine.charAt(caretPosition.x);
|
||||||
|
if((currentLine.length() == caretPosition.x && direction > 0) || (caretPosition.x == 0 && direction < 0)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
caretPosition.x += direction;
|
||||||
|
if(currentLine.length() == caretPosition.x && direction > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
currentChar = currentLine.charAt(caretPosition.x);
|
||||||
|
if(caretPosition.x == 0 && direction < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} while((currentChar >= 'a' && currentChar <= 'z') || (currentChar >= 'A' && currentChar <= 'Z'));
|
||||||
|
}
|
||||||
|
|
||||||
private void deleteSelection() {
|
private void deleteSelection() {
|
||||||
selectionRectangles.clear();
|
selectionRectangles.clear();
|
||||||
|
|||||||
@@ -1,185 +1,330 @@
|
|||||||
package guiTree.Components;
|
package guiTree.Components;
|
||||||
|
|
||||||
|
import guiTree.Components.Decoarations.LeftTextAligner;
|
||||||
|
import guiTree.Components.Decoarations.RightTextAligner;
|
||||||
|
import guiTree.Components.Decoarations.TextAligner;
|
||||||
|
import guiTree.Helper.Point2;
|
||||||
|
import guiTree.Helper.Point4;
|
||||||
import guiTree.Visual;
|
import guiTree.Visual;
|
||||||
|
import guiTree.events.KeyAdapter;
|
||||||
import guiTree.events.MouseAdapter;
|
import guiTree.events.MouseAdapter;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
|
import java.awt.datatransfer.DataFlavor;
|
||||||
|
import java.awt.datatransfer.StringSelection;
|
||||||
|
import java.awt.datatransfer.Transferable;
|
||||||
|
import java.awt.datatransfer.UnsupportedFlavorException;
|
||||||
|
import java.awt.event.KeyEvent;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class Text extends Visual {
|
public class Text extends Visual {
|
||||||
private String text;
|
private List<StringBuilder> lines;
|
||||||
private boolean selectable;
|
private String title;
|
||||||
private int startIndex;
|
private Point2<Integer> caretPosition;
|
||||||
private int endIndex;
|
private Point2<Integer> startDragPosition;
|
||||||
private int textWidth;
|
private List<StringBuilder> selectedText;
|
||||||
private int textHeight;
|
private List<Point4<Integer>> selectionRectangles;
|
||||||
private boolean inside;
|
|
||||||
private int[] characterWidthMap;
|
|
||||||
private FontMetrics fontMetrics;
|
private FontMetrics fontMetrics;
|
||||||
private int textX;
|
private TextAligner textAligner;
|
||||||
private int textY;
|
private int paragraphSpacing;
|
||||||
|
private boolean selectable;
|
||||||
|
|
||||||
public Text() {
|
public Text() {
|
||||||
this(0, 0, "");
|
this(true, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
public Text(int x, int y, String text) {
|
public Text(Boolean visible) {
|
||||||
super(x, y);
|
this(visible, "");
|
||||||
this.text = text;
|
}
|
||||||
inside = false;
|
|
||||||
characterWidthMap = new int[text.length()];
|
public Text(String title) {
|
||||||
startIndex = -1;
|
this(true, title);
|
||||||
endIndex = -1;
|
}
|
||||||
textX = 0;
|
|
||||||
textY = 0;
|
public Text(Boolean visible, String title) {
|
||||||
|
super();
|
||||||
|
this.title = title;
|
||||||
|
lines = new ArrayList<>();
|
||||||
|
selectionRectangles = new ArrayList<>();
|
||||||
|
lines.add(new StringBuilder());
|
||||||
|
caretPosition = new Point2<>(0, 0);
|
||||||
|
startDragPosition = new Point2<>(0, 0);
|
||||||
|
textAligner = new LeftTextAligner();
|
||||||
|
paragraphSpacing = 1;
|
||||||
|
selectable = true;
|
||||||
|
selectedText = new ArrayList<>();
|
||||||
|
|
||||||
addMouseListener(new MouseAdapter() {
|
addMouseListener(new MouseAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void mousePressed(MouseEvent mouseEvent) {
|
public void mouseDragged(MouseEvent mouseEvent) {
|
||||||
int x = mouseEvent.getX();
|
caretPosition = getCaretPosition(mouseEvent.getX(), mouseEvent.getY());
|
||||||
int y = mouseEvent.getY();
|
setSelection();
|
||||||
if(isOverText(x, y)) {
|
|
||||||
startIndex = getCharAt(x);
|
|
||||||
System.out.println("Start Index: " + startIndex);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
startIndex = -1;
|
|
||||||
endIndex = -1;
|
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void mouseDragged(MouseEvent mouseEvent) {
|
public void mousePressed(MouseEvent mouseEvent) {
|
||||||
int x = mouseEvent.getX();
|
caretPosition = getCaretPosition(mouseEvent.getX(), mouseEvent.getY());
|
||||||
int y = mouseEvent.getY();
|
startDragPosition = new Point2<>(caretPosition.x, caretPosition.y);
|
||||||
|
setSelection();
|
||||||
if(startIndex != -1) {
|
}
|
||||||
endIndex = getCharAt(x);
|
@Override
|
||||||
System.out.println("End index: " + endIndex);
|
public void mouseEntered(MouseEvent mouseEvent) {
|
||||||
|
if(selectable) {
|
||||||
|
setCursor(new Cursor(Cursor.TEXT_CURSOR));
|
||||||
}
|
}
|
||||||
update();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void mouseExited(MouseEvent mouseEvent) {
|
public void mouseExited(MouseEvent mouseEvent) {
|
||||||
if(inside) {
|
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
|
||||||
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
addKeyListener(new KeyAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void mouseMoved(MouseEvent mouseEvent) {
|
public void keyPressed(KeyEvent keyEvent) {
|
||||||
int x = mouseEvent.getX();
|
if(keyEvent.getKeyCode() == KeyEvent.VK_C) {
|
||||||
int y = mouseEvent.getY();
|
if(keyEvent.isControlDown()) {
|
||||||
if(isOverText(x, y)) {
|
copyToClipboard();
|
||||||
if(!inside) {
|
return;
|
||||||
setCursor(new Cursor(Cursor.TEXT_CURSOR));
|
|
||||||
inside = true;
|
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
if(inside) {
|
|
||||||
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
|
if(keyEvent.getKeyCode() == KeyEvent.VK_V) {
|
||||||
inside = false;
|
if(keyEvent.isControlDown()) {
|
||||||
|
pasteFromClipboard();
|
||||||
|
update();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(keyEvent.getKeyCode() == KeyEvent.VK_A) {
|
||||||
|
if(keyEvent.isControlDown()) {
|
||||||
|
selectAll();
|
||||||
|
update();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getText() {
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setText(String text) {
|
|
||||||
this.text = text;
|
|
||||||
characterWidthMap = new int[text.length()];
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSelectable(Boolean selectable) {
|
|
||||||
this.selectable = selectable;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getCharAt(int x) {
|
|
||||||
int location = (getWidth() - textWidth)/2;
|
|
||||||
for(int i = 0; i < text.length(); i++) {
|
|
||||||
if(x < location + characterWidthMap[i] / 2) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
location += characterWidthMap[i];
|
|
||||||
}
|
|
||||||
return text.length()-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setFont(Font font) {
|
public void setFont(Font font) {
|
||||||
super.setFont(font);
|
super.setFont(font);
|
||||||
fontMetrics = null;
|
fontMetrics = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isOverText(int x, int y) {
|
@Override
|
||||||
if(x < textX || x > textX + textWidth) {
|
public void setSize() {
|
||||||
return false;
|
super.setSize();
|
||||||
}
|
textAligner.setSize(getWidth(), getHeight());
|
||||||
if(y > textY || y < textY - textHeight) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
System.out.println("Text X: " + textX + " Text Y: " + textY + " x: " + x + " y: " + y + " textWidth: " + textWidth + " textHeight: " + textHeight);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setCharacterWidthMap() {
|
public void setSpacing(int spacing) {
|
||||||
for(int i = 0; i < text.length(); i++) {
|
this.paragraphSpacing = spacing;
|
||||||
int charWidth = fontMetrics.charWidth(text.charAt(i));
|
textAligner.setSpacing(spacing);
|
||||||
characterWidthMap[i] = charWidth;
|
|
||||||
}
|
|
||||||
textWidth = fontMetrics.stringWidth(text);
|
|
||||||
textHeight = fontMetrics.getHeight();
|
|
||||||
textX = (getWidth() - textWidth)/2;
|
|
||||||
textY = (getHeight() + textHeight)/2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setSelectable(boolean selectable) {
|
||||||
|
this.selectable = selectable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setText(String text) {
|
||||||
|
lines.clear();
|
||||||
|
int lineIndex = text.indexOf('\n');
|
||||||
|
while(lineIndex != -1) {
|
||||||
|
lines.add(new StringBuilder(text.substring(0, lineIndex)));
|
||||||
|
text = text.substring(lineIndex + 1);
|
||||||
|
lineIndex = text.indexOf('\n');
|
||||||
|
}
|
||||||
|
lines.add(new StringBuilder(text));
|
||||||
|
textAligner.setWholeText(lines);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAlignment(String textAlignment) {
|
||||||
|
textAlignment = textAlignment.toLowerCase();
|
||||||
|
if(textAlignment.equals("left")) {
|
||||||
|
textAligner = new LeftTextAligner();
|
||||||
|
textAligner.setWholeText(lines);
|
||||||
|
textAligner.setSize(getWidth(), getHeight());
|
||||||
|
textAligner.setSpacing(paragraphSpacing);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(textAlignment.equals("right")) {
|
||||||
|
textAligner = new RightTextAligner();
|
||||||
|
textAligner.setWholeText(lines);
|
||||||
|
textAligner.setSize(getWidth(), getHeight());
|
||||||
|
textAligner.setSpacing(paragraphSpacing);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
System.err.println("Alignment does not exist");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void copyToClipboard() {
|
||||||
|
StringBuilder clipboardText = new StringBuilder();
|
||||||
|
for(StringBuilder line: selectedText) {
|
||||||
|
clipboardText.append(line).append('\n');
|
||||||
|
}
|
||||||
|
StringSelection stringSelection = new StringSelection(clipboardText.toString());
|
||||||
|
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void selectAll() {
|
||||||
|
caretPosition.x = lines.get(lines.size() - 1).length();
|
||||||
|
caretPosition.y = lines.size() - 1;
|
||||||
|
startDragPosition.x = 0;
|
||||||
|
startDragPosition.y = 0;
|
||||||
|
setSelection();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void pasteFromClipboard() {
|
||||||
|
Transferable clipboardTransferable = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(this);
|
||||||
|
String clipboardText = null;
|
||||||
|
try {
|
||||||
|
clipboardText = (String) clipboardTransferable.getTransferData(DataFlavor.stringFlavor);
|
||||||
|
} catch (UnsupportedFlavorException | IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
if(clipboardText == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
clipboardText = clipboardText.substring(0, clipboardText.length() -1 );
|
||||||
|
if(clipboardText.indexOf('\n') == -1) {
|
||||||
|
lines.get(caretPosition.y).insert(caretPosition.x, clipboardText);
|
||||||
|
caretPosition.x += clipboardText.length();
|
||||||
|
startDragPosition = caretPosition;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Point2<Integer> getPositionOnScreen(int x, int y){
|
||||||
|
return textAligner.getPositionOnScreen(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Point2<Integer> getCaretPosition(int x, int y) {
|
||||||
|
return textAligner.getCaretPosition(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void deleteSelection() {
|
||||||
|
selectionRectangles.clear();
|
||||||
|
selectedText.clear();
|
||||||
|
|
||||||
|
if(caretPosition.equals(startDragPosition)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Point2<Integer> selectionStart;
|
||||||
|
Point2<Integer> selectionEnd;
|
||||||
|
if(caretPosition.compareTo(startDragPosition) < 0) {
|
||||||
|
selectionStart = new Point2<>(caretPosition);
|
||||||
|
selectionEnd = new Point2<>(startDragPosition);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
selectionStart = new Point2<>(startDragPosition);
|
||||||
|
selectionEnd = new Point2<>(caretPosition);
|
||||||
|
}
|
||||||
|
caretPosition = selectionStart;
|
||||||
|
|
||||||
|
if(selectionStart.y.equals(selectionEnd.y)) {
|
||||||
|
StringBuilder currentLine = lines.get(selectionStart.y);
|
||||||
|
int lineLength = currentLine.length();
|
||||||
|
int newLength = lineLength - selectionEnd.x + selectionStart.x;
|
||||||
|
currentLine.insert(selectionStart.x, currentLine.substring(selectionEnd.x));
|
||||||
|
currentLine = new StringBuilder(currentLine.substring(0, newLength));
|
||||||
|
lines.set(selectionStart.y, currentLine);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(selectionStart.y + 1 < selectionEnd.y) {
|
||||||
|
lines.remove(selectionStart.y + 1);
|
||||||
|
selectionEnd.y--;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder currentLine = lines.get(selectionStart.y);
|
||||||
|
currentLine.insert(selectionStart.x, lines.get(selectionEnd.y).substring(selectionEnd.x));
|
||||||
|
currentLine = new StringBuilder(currentLine.substring(0, selectionStart.x + lines.get(selectionEnd.y).substring(selectionEnd.x).length()));
|
||||||
|
lines.remove((int)selectionEnd.y);
|
||||||
|
lines.set(selectionStart.y, currentLine);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setSelection() {
|
||||||
|
if(!selectable) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
selectedText.clear();
|
||||||
|
selectionRectangles.clear();
|
||||||
|
System.out.println(caretPosition + " " + startDragPosition);
|
||||||
|
if(caretPosition.equals(startDragPosition)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Point2<Integer> selectionStart;
|
||||||
|
Point2<Integer> selectionEnd;
|
||||||
|
if(caretPosition.compareTo(startDragPosition) < 0) {
|
||||||
|
selectionStart = new Point2<>(caretPosition);
|
||||||
|
selectionEnd = new Point2<>(startDragPosition);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
selectionStart = new Point2<>(startDragPosition);
|
||||||
|
selectionEnd = new Point2<>(caretPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(selectionEnd.y.equals(selectionStart.y)) {
|
||||||
|
selectedText.add(new StringBuilder());
|
||||||
|
Point2<Integer> startRect = getPositionOnScreen(selectionStart.x, selectionStart.y);
|
||||||
|
Point2<Integer> endRect = getPositionOnScreen(selectionEnd.x, selectionEnd.y);
|
||||||
|
selectionRectangles.add(new Point4<>(startRect.x, startRect.y + 3, endRect.x, endRect.y + fontMetrics.getHeight() + 3));
|
||||||
|
StringBuilder currentLine = lines.get(selectionStart.y);
|
||||||
|
for(int x = selectionStart.x; x < selectionEnd.x; x++) {
|
||||||
|
selectedText.get(0).insert(selectedText.get(0).length(), currentLine.charAt(x));
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int y = selectionStart.y; y < selectionEnd.y; y++) {
|
||||||
|
StringBuilder currentLine = lines.get(y);
|
||||||
|
Point2<Integer> startRect = getPositionOnScreen(selectionStart.x, y);
|
||||||
|
Point2<Integer> endRect = getPositionOnScreen(currentLine.length(), y);
|
||||||
|
selectionRectangles.add(new Point4<>(startRect.x, startRect.y + 3, endRect.x, endRect.y + fontMetrics.getHeight() + 3));
|
||||||
|
selectedText.add(new StringBuilder());
|
||||||
|
int selectionIndex = 0;
|
||||||
|
for(int x = selectionStart.x; x < currentLine.length(); x++) {
|
||||||
|
selectedText.get(selectedText.size() - 1).insert(selectionIndex++, currentLine.charAt(x));
|
||||||
|
}
|
||||||
|
selectionStart.x = 0;
|
||||||
|
}
|
||||||
|
StringBuilder currentLine = lines.get(selectionEnd.y);
|
||||||
|
selectedText.add(new StringBuilder());
|
||||||
|
Point2<Integer> startRect = getPositionOnScreen(selectionStart.x, selectionEnd.y);
|
||||||
|
Point2<Integer> endRect = getPositionOnScreen(selectionEnd.x, selectionEnd.y);
|
||||||
|
selectionRectangles.add(new Point4<>(startRect.x, startRect.y + 3, endRect.x, endRect.y + fontMetrics.getHeight() + 3));
|
||||||
|
int selectionIndex = 0;
|
||||||
|
for(int x = 0; x < selectionEnd.x; x++) {
|
||||||
|
selectedText.get(selectedText.size() - 1).insert(selectionIndex++, currentLine.charAt(x));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void paint(BufferedImage imageBuffer) {
|
public void paint(BufferedImage imageBuffer) {
|
||||||
Graphics2D g = imageBuffer.createGraphics();
|
Graphics2D g = imageBuffer.createGraphics();
|
||||||
|
|
||||||
if(getFont() != null) {
|
|
||||||
g.setFont(getFont());
|
|
||||||
}
|
|
||||||
if(fontMetrics == null) {
|
if(fontMetrics == null) {
|
||||||
fontMetrics = g.getFontMetrics();
|
fontMetrics = g.getFontMetrics();
|
||||||
setCharacterWidthMap();
|
textAligner.setFontMetrics(fontMetrics);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(startIndex != -1 && endIndex != -1) {
|
if(selectable) {
|
||||||
int startX;
|
|
||||||
int endX;
|
|
||||||
if(startIndex > endIndex) {
|
|
||||||
endX = startIndex - 1;
|
|
||||||
startX = endIndex;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
startX = startIndex;
|
|
||||||
endX = endIndex;
|
|
||||||
}
|
|
||||||
int highlightStartX = textX;
|
|
||||||
int highlightEndX = textX;
|
|
||||||
|
|
||||||
for(int i = 0; i <= endX; i++) {
|
|
||||||
if(i < startX) {
|
|
||||||
highlightStartX += characterWidthMap[i];
|
|
||||||
}
|
|
||||||
highlightEndX += characterWidthMap[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
g.setColor(Color.BLUE);
|
g.setColor(Color.BLUE);
|
||||||
g.fillRect(highlightStartX, textY - textHeight + 3, highlightEndX - highlightStartX, textHeight);
|
for (Point4<Integer> rect : selectionRectangles) {
|
||||||
|
g.fillRect(rect.a, rect.b, rect.c - rect.a, rect.d - rect.b + paragraphSpacing);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g.setColor(getFontColor());
|
g.setColor(getFontColor());
|
||||||
|
for(StringBuilder line: lines) {
|
||||||
g.drawString(text, textX, textY);
|
Point2<Integer> position = textAligner.alignLine(line.toString(), lines.indexOf(line));
|
||||||
|
g.drawString(line.toString(), position.x, position.y);
|
||||||
g.dispose();
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package guiTree.Helper;
|
|||||||
|
|
||||||
public class Debugger {
|
public class Debugger {
|
||||||
public enum Tag {
|
public enum Tag {
|
||||||
LISTENER(true),
|
LISTENER(false),
|
||||||
PAINTING(false),
|
PAINTING(false),
|
||||||
FPS(false),
|
FPS(false),
|
||||||
ANIMATIONS(false),
|
ANIMATIONS(false),
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package guiTree;
|
package guiTree;
|
||||||
|
|
||||||
import guiTree.Animations.AnimationInterface;
|
import guiTree.Animations.AnimationInterface;
|
||||||
|
import guiTree.Components.Decoarations.Decoration;
|
||||||
import guiTree.Helper.Debugger;
|
import guiTree.Helper.Debugger;
|
||||||
import guiTree.Helper.Point2;
|
import guiTree.Helper.Point2;
|
||||||
import guiTree.Helper.Timer;
|
import guiTree.Helper.Timer;
|
||||||
@@ -337,15 +338,27 @@ public class Visual {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void addVisual(Visual child) {
|
public void addVisual(Visual child) {
|
||||||
this.children.add(child);
|
children.add(child);
|
||||||
child.setParent(this);
|
child.setParent(this);
|
||||||
child.setLocation();
|
child.setLocation();
|
||||||
child.setSize();
|
child.setSize();
|
||||||
|
|
||||||
if(this.active) {
|
if(active) {
|
||||||
child.activate();
|
child.activate();
|
||||||
}
|
}
|
||||||
update();
|
child.update();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addVisual(Decoration decoration) {
|
||||||
|
children.add(decoration);
|
||||||
|
((Visual)decoration).setParent(this);
|
||||||
|
decoration.setLocation();
|
||||||
|
decoration.setSize();
|
||||||
|
|
||||||
|
if(active) {
|
||||||
|
((Visual)decoration).activate();
|
||||||
|
}
|
||||||
|
decoration.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeVisual(Visual child) {
|
public void removeVisual(Visual child) {
|
||||||
@@ -410,7 +423,7 @@ public class Visual {
|
|||||||
timer.startTiming();
|
timer.startTiming();
|
||||||
|
|
||||||
clearImageBuffer();
|
clearImageBuffer();
|
||||||
this.paint(imageBuffer);
|
paint(imageBuffer);
|
||||||
for (Visual v : children) {
|
for (Visual v : children) {
|
||||||
if (v.dirty && v.active) {
|
if (v.dirty && v.active) {
|
||||||
v.revalidate();
|
v.revalidate();
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package parser;
|
package parser;
|
||||||
|
|
||||||
import com.sun.jdi.InvalidTypeException;
|
import com.sun.jdi.InvalidTypeException;
|
||||||
|
import guiTree.Components.Decoarations.Decoration;
|
||||||
import parser.converters.Converter;
|
import parser.converters.Converter;
|
||||||
import guiTree.Helper.Debugger;
|
import guiTree.Helper.Debugger;
|
||||||
import guiTree.Visual;
|
import guiTree.Visual;
|
||||||
@@ -46,7 +47,6 @@ public class XAMLParser {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
Method method = object.getClass().getMethod(methodName, parameterTypes);
|
Method method = object.getClass().getMethod(methodName, parameterTypes);
|
||||||
assert method != null;
|
|
||||||
method.invoke(object, parameterList.toArray());
|
method.invoke(object, parameterList.toArray());
|
||||||
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
|
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@@ -126,7 +126,7 @@ public class XAMLParser {
|
|||||||
}
|
}
|
||||||
Debugger.log("Parsing " + parentClass, Debugger.Tag.PARSING);
|
Debugger.log("Parsing " + parentClass, Debugger.Tag.PARSING);
|
||||||
Object parentObject = parentClass.getDeclaredConstructor().newInstance();
|
Object parentObject = parentClass.getDeclaredConstructor().newInstance();
|
||||||
Debugger.log("Constructor called succesfuly for " + parentObject, Debugger.Tag.PARSING);
|
Debugger.log("Constructor called successfully for " + parentObject, Debugger.Tag.PARSING);
|
||||||
|
|
||||||
setAttributes(parentObject, parentNode.getAttributes());
|
setAttributes(parentObject, parentNode.getAttributes());
|
||||||
|
|
||||||
@@ -139,9 +139,17 @@ public class XAMLParser {
|
|||||||
|
|
||||||
Object childObject = parseNode(childNode);
|
Object childObject = parseNode(childNode);
|
||||||
|
|
||||||
if(parentObject instanceof Visual && childObject instanceof Visual) {
|
if(parentObject instanceof Visual) {
|
||||||
Debugger.log("Adding " + childObject + " to " + parentObject, Debugger.Tag.PARSING);
|
if(childObject instanceof Decoration) {
|
||||||
addVisual((Visual) parentObject, (Visual) childObject);
|
Debugger.log("Adding decoration " + childObject + " to " + parentObject, Debugger.Tag.PARSING);
|
||||||
|
((Visual)parentObject).addVisual((Decoration) childObject);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (childObject instanceof Visual) {
|
||||||
|
Debugger.log("Adding " + childObject + " to " + parentObject, Debugger.Tag.PARSING);
|
||||||
|
addVisual((Visual) parentObject, (Visual) childObject);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user