Смешной код

2 коммент. | добавить комментарий
Несколько смешных участков кода из нескольких проектов:

1. Магический скрипт

private final String magicScript = "\nif(8==8)return;";


2. Глубокая иерархия

public void dragEnter(DropTargetDragEvent arg0) {
((DropTargetListener)getParent().getParent().getParent()
.getParent().getParent()).dragEnter(arg0);
}

public void dragExit(DropTargetEvent arg0) {
((DropTargetListener)getParent().getParent().getParent()
.getParent().getParent()).dragExit(arg0);

}

public void dragOver(DropTargetDragEvent arg0) {
((DropTargetListener)getParent().getParent().getParent()
.getParent().getParent()).dragOver(arg0);

}

public void drop(DropTargetDropEvent arg0) {
((DropTargetListener)getParent().getParent().getParent()
.getParent().getParent()).drop(arg0);
}

public void dropActionChanged(DropTargetDragEvent arg0) {
((DropTargetListener)getParent().getParent().getParent()
.getParent().getParent()).dropActionChanged(arg0);
}


3. Магические вычисления

int ww0 = getWidth() ;//- 40;
int hh0 = getHeight();// - 40;
int sz = Math.min(ww0, hh0);

sz = sz/4*3;


int y0 = (hh0 - sz) / 2;



int x0 = 0;
int h = sz / 2;
int dh = sz / 4;

int y = y0 + h;

int hh = (int)Math.sqrt(h*h - h*h/4);
y0 = y - hh;


Rectangle rect = new Rectangle(x0, y0 , sz, hh + hh );

int arrX[] = {x0 + dh, x0 + 3*dh, x0 + sz,
x0 + 3*dh , x0 + dh, x0};
int arrY[] = {y0 , y0 , y ,
y0 + hh + hh, y0 + hh + hh, y};

Polygon poly = new Polygon(arrX, arrY, 6);

return poly;

CROW: Control the Development Workflow

7 коммент. | добавить комментарий

Начало истории - см. здесь.

Сегодня выложил на SourceForge.net исходники и snapshot-релиз своего нового Java-проекта CROW (Control the development workflow).

CROW - это ASPICE-совместимая система, предназначенная для управления и мониторинга:
  • требований заказчика
  • технических требований
  • описания архитектуры
  • детального дизайна
  • ревизий кода в системе версионного контроля
  • тестов
В настоящее время программа позволяет:
  • добавлять/удалять/редактировать все артефакты, перечисленные выше
  • устанавливать зависимости между ними (например, "changelist #800 реализует техническое требование REQ-007-DAT-DragAndDrop, которое описывает требование заказчика Support drag&drop of DAT-files")
  • строить матрицу трассировки (RTM, Requirements Traceability Matrix), показывающую описанные выше отношения, в т.ч. транзитивные, т.е. связь между CRS и тестом через код, детальный дизайн, архитектуру и TRS программа вам покажет)
  • создавать метки и присваивать их различным артефактам, что позволяет определять и фиксировать т.н. baseline для требований, ревизий, тестов и пр.
Немного о реализации:
  • JRE 1.6, в более старых не тестировал и не хочу.
  • GUI в виде Swing-клиента. Пишу для Windows, но в Linux тоже проверял - явных косяков нет.
  • База - через Hibernate. В текущей реализации используется PostgreSQL.
  • Использую docking framework VLDocking, чтобы все окошки можно было перетаскивать как нравится.
  • Пишу все сам, тестировщиков также нет. Добровольцы призываются!
Адрес проекта на SourceForge - http://sourceforge.net/projects/opencrow/.

Баг в JTable: теряется множественный selection при начале DnD

0 коммент. | добавить комментарий
Пишу класс, перегружающий JTable, и снова вижу баг, который видел еще под JRE 1.4.2 году в 2006-м.

Ссылка на баг: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6195469.

Ошибка заключается в том, что, если в JTable выделить несколько ячеек и попытаться их перетащить (drag & drop), то, сразу же после нажатия кнопки мыши, selection сбрасывается со всех ячеек, кроме той, на которую непосредстенно нажали.

Воркараунд, приведенный по ссылке выше, по крайней мере в 1.6 не работает. Поэтому выкладываю свой класс FixedTableUI, которым можно подменить тот класс, который предлагается в воркараунде. Работает с 1.4 по 1.6 включительно:

/**
* This internal helper class helps to solve two bugs:
* The first is disable row selection with mouse drag
* The second is allow handling of multiple selected rows without need to
* hold a Shift key.
*/
private class FixedTableUI extends BasicTableUI {
private MouseInputHandler handler = new MouseInputHandler() {

private boolean isShiftDownInMousePressed = false;


public void mouseDragged(MouseEvent e) {
// Do nothing here!
}

public void mousePressed(MouseEvent e) {
isShiftDownInMousePressed = e.isShiftDown();
int row = rowAtPoint(e.getPoint());
if (!getSelectionModel().isSelectedIndex(row)) {
super.mousePressed(e);
} else {
if (e.isControlDown()) {
if (getSelectionModel().isSelectedIndex(row)) {
getSelectionModel().removeSelectionInterval(row, row);
}
}
}
}

public void mouseReleased(MouseEvent e) {
super.mouseReleased(e);
int row = rowAtPoint(e.getPoint());
int col = columnAtPoint(e.getPoint());
int[] selRows = getSelectedRows();
if (selRows.length > 0) {
if (!e.isControlDown() && !e.isShiftDown() &&
!isShiftDownInMousePressed) {
getSelectionModel().setSelectionInterval(row, row);
}
}
}
};

protected MouseInputListener createMouseInputListener() {
return handler;
}
}