/*
* Diese Datei ist Teil des GDialog Projektes:
* "Gigaset-Erweiterung für ProjectX"
*
* Das GDialog Projekt ist freigegeben unter
* der GNU Public Licence (GPL), deren Text sich in
* dem Quellen-Verzeichnis befindet. Ist er dort nicht
* mehr vorhanden, so kann er unter http://www.gnu.org/licenses/gpl.html
* eingesehen werden.
*/
package de.m740.projectx.gigaset;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.EventListenerList;
/**
*
* @author arnaud
*
*/
public abstract class GPanelAbstract extends JPanel implements GPanelTableIF {
// ----------------------------------------------------------
/**
* File comparator A to Z
*/
class FileComparatorAZ implements Comparator {
public int compare(Object arg0, Object arg1) {
try {
GAufnahmeIF tmpAufnahme = (GAufnahmeIF) arg0;
String tmpFN0 = tmpAufnahme.getOriginalTitel();
tmpAufnahme = (GAufnahmeIF) arg1;
String tmpFN1 = tmpAufnahme.getOriginalTitel();
return tmpFN0.compareToIgnoreCase(tmpFN1);
} catch (Exception e) {
// ignore
}
return 0;
}
}
// ----------------------------------------------------------
/**
* File comparator Z to A
*/
class FileComparatorZA implements Comparator {
public int compare(Object arg0, Object arg1) {
try {
return -(getFileComparatorAZ().compare(arg0, arg1));
} catch (Exception e) {
// ignore
}
return 0;
}
}
// ----------------------------------------------------------
/**
* File comparator newer to older
*/
class FileComparatorON implements Comparator {
public int compare(Object arg0, Object arg1) {
try {
GAufnahmeIF tmpAufnahme = (GAufnahmeIF) arg0;
String tmpFN0 = tmpAufnahme.getCridFilename();
tmpAufnahme = (GAufnahmeIF) arg1;
String tmpFN1 = tmpAufnahme.getCridFilename();
return tmpFN0.compareTo(tmpFN1);
} catch (Exception e) {
// ignore
}
return 0;
}
}
// ----------------------------------------------------------
/**
* File comparator newer to older
*/
class FileComparatorNO implements Comparator {
public int compare(Object arg0, Object arg1) {
try {
return -(getFileComparatorON().compare(arg0, arg1));
} catch (Exception e) {
// ignore
}
return 0;
}
}
// ----------------------------------------------------------
protected List aAufnahmen = null;
protected GTableModel aTableModel = new GTableModel();
protected GTable aTableAufnahmen = new GTable(aTableModel);
protected JScrollPane spAufnahmen = new JScrollPane(aTableAufnahmen);
private FileComparatorAZ aFileComparatorAZ = null;
private FileComparatorZA aFileComparatorZA = null;
private FileComparatorNO aFileComparatorNO = null;
private FileComparatorON aFileComparatorON = null;
protected int aSortSelector = SORT_FILES_NO;
private GDialog aDialog = null;
public GPanelAbstract() {
super();
initialize();
}
/**
*
*/
private void initialize() {
try {
aTableAufnahmen.setDefaultRenderer(Object.class,
new GTableCellRenderer());
// Font font = new Font("Monospaced", Font.PLAIN, 12);
// aTableAufnahmen.setFont(font);
} catch (RuntimeException exc) {
GConsole.setErrorMessage(exc);
}
}
/**
* @param inpIndex
* @param inpAufnahme
* @param inpHash
*/
protected void addAufnahme(int inpIndex, GAufnahmeIF inpAufnahme,
HashMap inpHash) {
// doppelte Titel prüfen ...
String tmpTitel = inpAufnahme.getOriginalTitel();
Object tmpObj = inpHash.get(tmpTitel);
if (tmpObj instanceof GAufnahmeContainer) {
GAufnahmeContainer tmpAufnahmeContainer = (GAufnahmeContainer) tmpObj;
GAufnahmeIF tmpAufnahmeIF = tmpAufnahmeContainer.getAufnahme();
tmpAufnahmeIF.setSerie(true);
inpAufnahme.setSerie(true);
tmpAufnahmeContainer.addChild(inpAufnahme);
} else {
// ... und Doubletten nummerieren
GAufnahmeContainer tmpAufnahmeContainer = new GAufnahmeContainer(
inpAufnahme);
inpHash.put(tmpTitel, tmpAufnahmeContainer);
// push to table
int row = aTableModel.getRowCount();
aTableModel.addRow(tmpAufnahmeContainer);
aTableModel.fireTableRowsInserted(row, row);
}
}
/**
*
* number children from old to newer
*/
public void countChildren(int selector) {
int anza = (aTableModel == null) ? 0 : aTableModel.getRowCount();
for (int i = 0; i < anza; i++) {
Object tmpObject = aTableModel.getObjectAtRow(i);
if (tmpObject instanceof GAufnahmeContainer) {
((GAufnahmeContainer) tmpObject).countChildren(selector);
}
} // for i
}
/**
*
*
*/
private void sortiereAufnahmen(Comparator inpComparator) {
clearSelection();
aTableModel.clear();
aTableModel.fireTableDataChanged();
fireStateChanged();
//
int anza = (aAufnahmen == null) ? 0 : aAufnahmen.size();
if (anza > 1) {
Collections.sort(aAufnahmen, inpComparator);
}
HashMap tmpHash = new HashMap(anza);
for (int i = 0; i < anza; i++) {
try {
GAufnahmeIF tmpAufnahme = (GAufnahmeIF) aAufnahmen.get(i);
addAufnahme(i, tmpAufnahme, tmpHash);
} catch (Exception exc) {
GConsole.setErrorMessage(exc);
}
} // for i
// evtl letzte Tree-Änderungen sichtbar machen
aTableModel.fireTableRowsUpdated(0, aTableModel.getRowCount() - 1);
tmpHash = null;
if (aTableModel.getRowCount() == 0) {
// falls keine Aufnahmen vorh.
getDialog().zeigeInfos(-1); // soll auch nix angezeigt w.!
}
}
/**
*
*
*/
public void sortiereAufnahmen(int selector) {
try {
switch (selector) {
case SORT_FILES_AZ:
sortiereAufnahmen(getFileComparatorAZ());
break;
case SORT_FILES_ZA:
sortiereAufnahmen(getFileComparatorZA());
break;
case SORT_FILES_NO:
sortiereAufnahmen(getFileComparatorNO());
break;
case SORT_FILES_ON:
sortiereAufnahmen(getFileComparatorON());
break;
}
} catch (RuntimeException exc) {
GConsole.setErrorMessage(exc);
}
}
public GAufnahmeIF getSelectedAufnahme() {
try {
if (aTableAufnahmen == null || aTableModel == null) {
return null;
}
int nr = aTableAufnahmen.getSelectedRow();
if (nr < 0) {
return null;
}
return aTableModel.getAufnahmeAtRow(nr);
} catch (Exception exc) {
GConsole.setErrorMessage(exc);
}
return null; // error
}
/**
*
*/
public int readSelectedAufnahme() {
try {
int nr = aTableAufnahmen.getSelectedRow();
if (nr < 0) {
return -1;
}
GAufnahmeIF tmpAufnahme = aTableModel.getAufnahmeAtRow(nr);
tmpAufnahme.readAufnahme();
return nr;
} catch (Exception e) {
GConsole.setErrorMessage(e);
}
return -1; // error
}
public String getSelectedExtension() {
GAufnahmeIF tmpAufnahme = getSelectedAufnahme();
if (tmpAufnahme == null) {
return null;
}
return tmpAufnahme.getExtension();
}
public String getSelectedOutname() {
String tmpString = getSelectedTitel();
// wenn ein Punkt im Titel ist,
// dann noch die Extension anhängen,
// weil sonst PjX den letzten Teil abschneidet
if (tmpString != null && tmpString.indexOf('.') >= 0) {
String tmpString2 = getSelectedExtension();
if (tmpString2 != null) {
tmpString += tmpString2;
}
}
return tmpString;
}
public String getSelectedTitel() {
GAufnahmeIF tmpAufnahme = getSelectedAufnahme();
if (tmpAufnahme == null) {
return null;
}
return tmpAufnahme.getTitel();
}
protected String shortPathOf(String inpPath) {
if (inpPath == null) {
return "";
}
char tmpC = File.separatorChar;
int x1 = inpPath.indexOf(tmpC);
String tmpString = "";
if (x1 > 0) {
int len = inpPath.length();
tmpString += inpPath.substring(0, x1 + 1);
inpPath = (len - 1 == x1) ? "" : inpPath.substring(x1 + 1);
}
int x2 = inpPath.lastIndexOf(File.separatorChar);
tmpString += (x2 == x1 || x2 < 0) ? inpPath : "..."
+ inpPath.substring(x2);
return tmpString;
}
/**
* Adds a ChangeListener
to this tabbedpane.
*
* @param l
* the ChangeListener
to add
* @see #fireStateChanged
* @see #removeChangeListener
*/
public void addChangeListener(ChangeListener l) {
removeChangeListener(l); // prevent double listening!
listenerList.add(ChangeListener.class, l);
}
/**
* Removes a ChangeListener
from this tabbedpane.
*
* @param l
* the ChangeListener
to remove
* @see #fireStateChanged
* @see #addChangeListener
*/
public void removeChangeListener(ChangeListener l) {
listenerList.remove(ChangeListener.class, l);
}
/**
* Sends a ChangeEvent
, whose source is this tabbedpane, to
* each listener. This method method is called each time a
* ChangeEvent
is received from the model.
*
* @see #addChangeListener
* @see EventListenerList
*/
protected void fireStateChanged() {
// Guaranteed to return a non-null array
Object[] listeners = listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event
ChangeEvent tmpChangeEvent = null;
for (int i = listeners.length - 2; i >= 0; i -= 2) {
if (listeners[i] == ChangeListener.class) {
// Lazily create the event:
if (tmpChangeEvent == null)
tmpChangeEvent = new ChangeEvent(this);
((ChangeListener) listeners[i + 1])
.stateChanged(tmpChangeEvent);
}
}
}
protected GDialog getDialog() {
return aDialog;
}
protected void setDialog(GDialog inpDialog) {
aDialog = inpDialog;
}
protected void clearSelection() {
aTableAufnahmen.getSelectionModel().clearSelection();
}
/**
*
*/
private void actionDone(boolean inpOK) {
if (!inpOK) {
clearSelection();
}
getDialog().actionDone(inpOK, true);
}
private boolean isExpander() {
boolean ok = false;
try {
if (aTableAufnahmen == null || aTableModel == null) {
return ok;
}
int nr = aTableAufnahmen.getSelectedRow();
if (nr < 0) {
return ok;
}
Object tmpObject = aTableModel.getObjectAtRow(nr);
if (tmpObject instanceof GAufnahmeContainer) {
GAufnahmeContainer tmpContainer = (GAufnahmeContainer) tmpObject;
if (!tmpContainer.hasChildren()) {
return false;
}
ok = true;
if (tmpContainer.isExpanded()) {
// collapse node
List tmpList = tmpContainer.getDoubles();
int anz = (tmpList == null) ? 0 : tmpList.size();
int i;
for (i = 0; i < anz; i++) {
GAufnahmeContainer tmpDouble = (GAufnahmeContainer) tmpList
.get(0);
aTableModel.removeRow(tmpDouble);
tmpContainer.removeDouble(tmpDouble);
} // for i
aTableModel.fireTableRowsDeleted(nr + 1, nr + i);
} else {
// expand node
List tmpList = tmpContainer.getChildren();
int anz = (tmpList == null) ? 0 : tmpList.size();
int r = nr;
for (int i = 0; i < anz; i++) {
GAufnahmeIF tmpAufnahme = (GAufnahmeIF) tmpList.get(i);
GAufnahmeContainer tmpDouble = new GAufnahmeContainer(
tmpAufnahme);
aTableModel.addRow(++r, tmpDouble);
tmpContainer.addDouble(tmpDouble);
} // for i
aTableModel.fireTableRowsInserted(nr + 1, r);
}
}
} catch (Exception exc) {
GConsole.setErrorMessage(exc);
}
return ok;
}
protected void mouseClick(MouseEvent event) {
int clicks = event.getClickCount();
int x = event.getX();
if (event.getButton() == 1 && clicks == 2 && x > 22) {
actionDone(true);
} else if (clicks == 1 & x < 21) {
if (isExpander()) {
return;
}
}
}
/**
* @return comparatorAZ
*/
protected FileComparatorAZ getFileComparatorAZ() {
if (aFileComparatorAZ == null) {
aFileComparatorAZ = new FileComparatorAZ();
}
return aFileComparatorAZ;
}
/**
* @return fileComparatorZA
*/
private FileComparatorZA getFileComparatorZA() {
if (aFileComparatorZA == null) {
aFileComparatorZA = new FileComparatorZA();
}
return aFileComparatorZA;
}
/**
* @return fileComparatorNO
*/
private FileComparatorNO getFileComparatorNO() {
if (aFileComparatorNO == null) {
aFileComparatorNO = new FileComparatorNO();
}
return aFileComparatorNO;
}
/**
* @return fileComparatorON
*/
protected FileComparatorON getFileComparatorON() {
if (aFileComparatorON == null) {
aFileComparatorON = new FileComparatorON();
}
return aFileComparatorON;
}
/**
* @return sortSelector
*/
protected int getSortSelector() {
return aSortSelector;
}
/**
* @param inpSortSelector Festzulegender sortSelector
*/
protected void setSortSelector(int inpSortSelector) {
aSortSelector = inpSortSelector;
}
}