/*
* Orion Viewer - pdf, djvu, xps and cbz file viewer for android devices
*
* Copyright (C) 2011-2013 Michael Bogdanov & Co
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package universe.constellation.orion.viewer.outline;
import android.app.Dialog;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import pl.polidea.treeview.AbstractTreeViewAdapter;
import pl.polidea.treeview.InMemoryTreeStateManager;
import pl.polidea.treeview.TreeBuilder;
import pl.polidea.treeview.TreeNodeInfo;
import universe.constellation.orion.viewer.Common;
import universe.constellation.orion.viewer.Controller;
import universe.constellation.orion.viewer.OrionViewerActivity;
import universe.constellation.orion.viewer.R;
public class OutlineAdapter extends AbstractTreeViewAdapter<Integer> {
private final OutlineItem items[];
private final Controller controller;
private final Dialog dialog;
public OutlineAdapter(Controller controller,
OrionViewerActivity activity,
Dialog dialog,
InMemoryTreeStateManager<Integer> manager,
OutlineItem items[]) {
super(activity, manager, 20);
this.items = items;
this.dialog = dialog;
this.controller = controller;
}
static public int initializeTreeManager(InMemoryTreeStateManager<Integer> manager, OutlineItem[] items, int currentPage) {
TreeBuilder<Integer> builder = new TreeBuilder<Integer>(manager);
int openAtIndex = -1;
OutlineItem lastItem = null;
Common.d("OutlineAdapter:: initializeTreeManager " + currentPage);
for (int i = 0; i < items.length; i++) {
OutlineItem curItem = items[i];
int last = i - 1;
if (lastItem != null && curItem.level > lastItem.level) {
builder.addRelation(last, i);
} else {
builder.sequentiallyAddNextNode(i, curItem.level);
}
if (curItem.page <= currentPage) {
openAtIndex = i;
}
lastItem = curItem;
}
int resultExpandIndex = -1;
if (openAtIndex != -1) {
Integer expand = openAtIndex;
while (expand != null) {
manager.expandDirectChildren(expand);
expand = manager.getParent(expand);
}
Integer[] hierarchyDescription = manager.getHierarchyDescription(openAtIndex);
for (Integer integer : hierarchyDescription) {
resultExpandIndex += integer + 1;
}
}
Common.d("OutlineAdapter:: initializeTreeManager -- END " + openAtIndex);
return resultExpandIndex;
}
@Override
public View getNewChildView(final TreeNodeInfo<Integer> treeNodeInfo) {
final LinearLayout viewLayout = (LinearLayout) getActivity()
.getLayoutInflater().inflate(R.layout.outline_entry, null);
return updateView(viewLayout, treeNodeInfo);
}
private String getDescription(final int id) {
return this.items[id].title;
}
private int getPage(final int id) {
return this.items[id].page;
}
@Override
public LinearLayout updateView(final View view,
final TreeNodeInfo<Integer> treeNodeInfo) {
final LinearLayout viewLayout = (LinearLayout) view;
((TextView)view.findViewById(R.id.title)).setText(getDescription(treeNodeInfo.getId()));
((TextView)view.findViewById(R.id.page)).setText(String.valueOf(getPage(treeNodeInfo.getId()) + 1));
return viewLayout;
}
@Override
public long getItemId(final int position) {
return getTreeId(position);
}
@Override
public Object getItem(final int position) {
int id = (int) getItemId(position);
return this.items[id];
}
@Override
public void handleItemClick(final View view, final Object id) {
final Integer longId = (Integer) id;
final TreeNodeInfo<Integer> info = getManager().getNodeInfo(longId);
if (false && info.isWithChildren()) {
super.handleItemClick(view, id);
} else {
controller.drawPage(this.items[longId].page);
this.dialog.dismiss();
}
}
}