/*
* SoapUI, Copyright (C) 2004-2016 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/
package com.eviware.soapui.support.components;
import com.eviware.soapui.SoapUI;
import com.jgoodies.forms.builder.ButtonBarBuilder;
import com.jgoodies.forms.layout.Sizes;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
/**
* A simple status bar for editors
*
* @author Ole.Matzura
*/
public class JEditorStatusBar extends JPanel implements CaretListener {
private JLabel caretLabel;
private JLabel infoLabel;
private JEditorStatusBarTarget target;
private JPanel statusPanel;
public JEditorStatusBar() {
this(null);
}
public JEditorStatusBar(JEditorStatusBarTarget target) {
this.target = target;
caretLabel = new JLabel();
caretLabel.setPreferredSize(new Dimension(60, 16));
infoLabel = new JLabel();
infoLabel.setVisible(false);
caretLabel.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createMatteBorder(0, 1, 0, 0, Color.LIGHT_GRAY),
BorderFactory.createMatteBorder(0, 1, 0, 0, Color.WHITE)));
ButtonBarBuilder builder = new ButtonBarBuilder(this);
builder.addGriddedGrowing(infoLabel);
builder.addStrut(Sizes.pixel(2));
statusPanel = new JPanel(new BorderLayout());
statusPanel.setPreferredSize(new Dimension(60, 16));
statusPanel.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createMatteBorder(0, 1, 0, 0, Color.LIGHT_GRAY),
BorderFactory.createMatteBorder(0, 1, 0, 0, Color.WHITE)));
builder.addFixed(statusPanel);
builder.addFixed(caretLabel);
builder.getPanel();
}
public void addNotify() {
super.addNotify();
if (target != null) {
target.addCaretListener(this);
}
}
public void removeNotify() {
super.removeNotify();
if (target != null) {
target.removeCaretListener(this);
}
}
public void caretUpdate(CaretEvent e) {
try {
if (target == null) {
caretLabel.setText("");
} else {
int offset = target.getCaretPosition();
int line = target.getLineOfOffset(offset);
int column = offset - target.getLineStartOffset(line);
caretLabel.setText(" " + (line + 1) + " : " + (column + 1));
}
} catch (Exception e1) {
SoapUI.logError(e1);
}
}
public void setTarget(JEditorStatusBarTarget target) {
if (this.target != null) {
this.target.removeCaretListener(this);
}
this.target = target;
this.target.addCaretListener(this);
caretUpdate(null);
}
public void setInfo(String txt) {
infoLabel.setText(txt);
infoLabel.setVisible(txt != null);
}
public void setStatusComponent(JComponent statusComponent) {
statusPanel.removeAll();
statusPanel.add(statusComponent, BorderLayout.CENTER);
statusPanel.revalidate();
}
/**
* Target for caret-status
*
* @author Ole.Matzura
*/
public interface JEditorStatusBarTarget {
void addCaretListener(CaretListener listener);
int getCaretPosition();
void removeCaretListener(CaretListener listener);
int getLineStartOffset(int line) throws Exception;
int getLineOfOffset(int offset) throws Exception;
;
}
}