SlideShare a Scribd company logo
Creating a WhatsApp Clone - Part V
public class MainForm extends Form {
private Tabs tabs = new Tabs();
private CameraKit ck;
private Container chats;
private Container status;
private Container calls;
private static MainForm instance;
public MainForm() {
super("WhatsApp Clone", new BorderLayout());
instance = this;
add(CENTER, tabs);
tabs.hideTabs();
ck = CameraKit.create();
tabs.addTab("", createCameraView());
tabs.addTab("", createChatsContainer());
tabs.addTab("", createStatusContainer());
MainForm
public class MainForm extends Form {
private Tabs tabs = new Tabs();
private CameraKit ck;
private Container chats;
private Container status;
private Container calls;
private static MainForm instance;
public MainForm() {
super("WhatsApp Clone", new BorderLayout());
instance = this;
add(CENTER, tabs);
tabs.hideTabs();
ck = CameraKit.create();
tabs.addTab("", createCameraView());
tabs.addTab("", createChatsContainer());
tabs.addTab("", createStatusContainer());
MainForm
public class MainForm extends Form {
private Tabs tabs = new Tabs();
private CameraKit ck;
private Container chats;
private Container status;
private Container calls;
private static MainForm instance;
public MainForm() {
super("WhatsApp Clone", new BorderLayout());
instance = this;
add(CENTER, tabs);
tabs.hideTabs();
ck = CameraKit.create();
tabs.addTab("", createCameraView());
tabs.addTab("", createChatsContainer());
tabs.addTab("", createStatusContainer());
MainForm
public class MainForm extends Form {
private Tabs tabs = new Tabs();
private CameraKit ck;
private Container chats;
private Container status;
private Container calls;
private static MainForm instance;
public MainForm() {
super("WhatsApp Clone", new BorderLayout());
instance = this;
add(CENTER, tabs);
tabs.hideTabs();
ck = CameraKit.create();
tabs.addTab("", createCameraView());
tabs.addTab("", createChatsContainer());
tabs.addTab("", createStatusContainer());
MainForm
public class MainForm extends Form {
private Tabs tabs = new Tabs();
private CameraKit ck;
private Container chats;
private Container status;
private Container calls;
private static MainForm instance;
public MainForm() {
super("WhatsApp Clone", new BorderLayout());
instance = this;
add(CENTER, tabs);
tabs.hideTabs();
ck = CameraKit.create();
tabs.addTab("", createCameraView());
tabs.addTab("", createChatsContainer());
tabs.addTab("", createStatusContainer());
MainForm
private Container status;
private Container calls;
private static MainForm instance;
public MainForm() {
super("WhatsApp Clone", new BorderLayout());
instance = this;
add(CENTER, tabs);
tabs.hideTabs();
ck = CameraKit.create();
tabs.addTab("", createCameraView());
tabs.addTab("", createChatsContainer());
tabs.addTab("", createStatusContainer());
tabs.addTab("", createCallsContainer());
tabs.setSelectedIndex(1);
Toolbar tb = getToolbar();
tb.setTitleComponent(createTitleComponent(chats, status, calls));
setBackCommand("", null, e -> {
if(tabs.getSelectedIndex() != 1) {
tabs.setSelectedIndex(1);
MainForm
private Container status;
private Container calls;
private static MainForm instance;
public MainForm() {
super("WhatsApp Clone", new BorderLayout());
instance = this;
add(CENTER, tabs);
tabs.hideTabs();
ck = CameraKit.create();
tabs.addTab("", createCameraView());
tabs.addTab("", createChatsContainer());
tabs.addTab("", createStatusContainer());
tabs.addTab("", createCallsContainer());
tabs.setSelectedIndex(1);
Toolbar tb = getToolbar();
tb.setTitleComponent(createTitleComponent(chats, status, calls));
setBackCommand("", null, e -> {
if(tabs.getSelectedIndex() != 1) {
tabs.setSelectedIndex(1);
MainForm
private Container status;
private Container calls;
private static MainForm instance;
public MainForm() {
super("WhatsApp Clone", new BorderLayout());
instance = this;
add(CENTER, tabs);
tabs.hideTabs();
ck = CameraKit.create();
tabs.addTab("", createCameraView());
tabs.addTab("", createChatsContainer());
tabs.addTab("", createStatusContainer());
tabs.addTab("", createCallsContainer());
tabs.setSelectedIndex(1);
Toolbar tb = getToolbar();
tb.setTitleComponent(createTitleComponent(chats, status, calls));
setBackCommand("", null, e -> {
if(tabs.getSelectedIndex() != 1) {
tabs.setSelectedIndex(1);
MainForm
tabs.addTab("", createCameraView());
tabs.addTab("", createChatsContainer());
tabs.addTab("", createStatusContainer());
tabs.addTab("", createCallsContainer());
tabs.setSelectedIndex(1);
Toolbar tb = getToolbar();
tb.setTitleComponent(createTitleComponent(chats, status, calls));
setBackCommand("", null, e -> {
if(tabs.getSelectedIndex() != 1) {
tabs.setSelectedIndex(1);
} else {
minimizeApplication();
}
});
}
public static MainForm getInstance() {
return instance;
}
private Container createCallsContainer() {
MainForm
tabs.addTab("", createCameraView());
tabs.addTab("", createChatsContainer());
tabs.addTab("", createStatusContainer());
tabs.addTab("", createCallsContainer());
tabs.setSelectedIndex(1);
Toolbar tb = getToolbar();
tb.setTitleComponent(createTitleComponent(chats, status, calls));
setBackCommand("", null, e -> {
if(tabs.getSelectedIndex() != 1) {
tabs.setSelectedIndex(1);
} else {
minimizeApplication();
}
});
}
public static MainForm getInstance() {
return instance;
}
private Container createCallsContainer() {
MainForm
}
public static MainForm getInstance() {
return instance;
}
private Container createCallsContainer() {
Container cnt = new Container(BoxLayout.y());
calls = cnt;
cnt.setScrollableY(true);
MultiButton chat = new MultiButton("Person");
chat.setTextLine2("Date & time");
cnt.add(chat);
FloatingActionButton fab = FloatingActionButton.
createFAB(FontImage.MATERIAL_CALL);
return fab.bindFabToContainer(cnt);
}
private Container createStatusContainer() {
Container cnt = new Container(BoxLayout.y());
status = cnt;
MainForm
}
public static MainForm getInstance() {
return instance;
}
private Container createCallsContainer() {
Container cnt = new Container(BoxLayout.y());
calls = cnt;
cnt.setScrollableY(true);
MultiButton chat = new MultiButton("Person");
chat.setTextLine2("Date & time");
cnt.add(chat);
FloatingActionButton fab = FloatingActionButton.
createFAB(FontImage.MATERIAL_CALL);
return fab.bindFabToContainer(cnt);
}
private Container createStatusContainer() {
Container cnt = new Container(BoxLayout.y());
status = cnt;
MainForm
FloatingActionButton fab = FloatingActionButton.
createFAB(FontImage.MATERIAL_CALL);
return fab.bindFabToContainer(cnt);
}
private Container createStatusContainer() {
Container cnt = new Container(BoxLayout.y());
status = cnt;
cnt.setScrollableY(true);
MultiButton chat = new MultiButton("My Status");
chat.setTextLine2("Tap to add status update");
cnt.add(chat);
FloatingActionButton fab = FloatingActionButton.
createFAB(FontImage.MATERIAL_CAMERA_ALT);
return fab.bindFabToContainer(cnt);
}
public void refreshChatsContainer() {
Server.fetchChatList(contacts -> {
chats.removeAll();
MainForm
return fab.bindFabToContainer(cnt);
}
public void refreshChatsContainer() {
Server.fetchChatList(contacts -> {
chats.removeAll();
for(ChatContact c : contacts) {
MultiButton chat = new MultiButton(c.name.get());
chat.setTextLine2(c.tagline.get());
if(chat.getTextLine2() == null ||
chat.getTextLine2().length() == 0) {
chat.setTextLine2("...");
}
chat.setIcon(c.getLargeIcon());
chats.add(chat);
chat.addActionListener(e -> new ChatForm(c, this).show());
}
chats.revalidate();
});
}
MainForm
return fab.bindFabToContainer(cnt);
}
public void refreshChatsContainer() {
Server.fetchChatList(contacts -> {
chats.removeAll();
for(ChatContact c : contacts) {
MultiButton chat = new MultiButton(c.name.get());
chat.setTextLine2(c.tagline.get());
if(chat.getTextLine2() == null ||
chat.getTextLine2().length() == 0) {
chat.setTextLine2("...");
}
chat.setIcon(c.getLargeIcon());
chats.add(chat);
chat.addActionListener(e -> new ChatForm(c, this).show());
}
chats.revalidate();
});
}
MainForm
return fab.bindFabToContainer(cnt);
}
public void refreshChatsContainer() {
Server.fetchChatList(contacts -> {
chats.removeAll();
for(ChatContact c : contacts) {
MultiButton chat = new MultiButton(c.name.get());
chat.setTextLine2(c.tagline.get());
if(chat.getTextLine2() == null ||
chat.getTextLine2().length() == 0) {
chat.setTextLine2("...");
}
chat.setIcon(c.getLargeIcon());
chats.add(chat);
chat.addActionListener(e -> new ChatForm(c, this).show());
}
chats.revalidate();
});
}
MainForm
return fab.bindFabToContainer(cnt);
}
public void refreshChatsContainer() {
Server.fetchChatList(contacts -> {
chats.removeAll();
for(ChatContact c : contacts) {
MultiButton chat = new MultiButton(c.name.get());
chat.setTextLine2(c.tagline.get());
if(chat.getTextLine2() == null ||
chat.getTextLine2().length() == 0) {
chat.setTextLine2("...");
}
chat.setIcon(c.getLargeIcon());
chats.add(chat);
chat.addActionListener(e -> new ChatForm(c, this).show());
}
chats.revalidate();
});
}
MainForm
return fab.bindFabToContainer(cnt);
}
public void refreshChatsContainer() {
Server.fetchChatList(contacts -> {
chats.removeAll();
for(ChatContact c : contacts) {
MultiButton chat = new MultiButton(c.name.get());
chat.setTextLine2(c.tagline.get());
if(chat.getTextLine2() == null ||
chat.getTextLine2().length() == 0) {
chat.setTextLine2("...");
}
chat.setIcon(c.getLargeIcon());
chats.add(chat);
chat.addActionListener(e -> new ChatForm(c, this).show());
}
chats.revalidate();
});
}
MainForm
return fab.bindFabToContainer(cnt);
}
public void refreshChatsContainer() {
Server.fetchChatList(contacts -> {
chats.removeAll();
for(ChatContact c : contacts) {
MultiButton chat = new MultiButton(c.name.get());
chat.setTextLine2(c.tagline.get());
if(chat.getTextLine2() == null ||
chat.getTextLine2().length() == 0) {
chat.setTextLine2("...");
}
chat.setIcon(c.getLargeIcon());
chats.add(chat);
chat.addActionListener(e -> new ChatForm(c, this).show());
}
chats.revalidate();
});
}
MainForm
chat.addActionListener(e -> new ChatForm(c, this).show());
}
chats.revalidate();
});
}
private Container createChatsContainer() {
chats = new Container(BoxLayout.y());
chats.setScrollableY(true);
refreshChatsContainer();
FloatingActionButton fab = FloatingActionButton.
createFAB(FontImage.MATERIAL_CHAT);
fab.addActionListener(e -> new NewMessageForm().show());
return fab.bindFabToContainer(chats);
}
private Container createCameraView() {
if(ck != null) {
MainForm
chat.addActionListener(e -> new ChatForm(c, this).show());
}
chats.revalidate();
});
}
private Container createChatsContainer() {
chats = new Container(BoxLayout.y());
chats.setScrollableY(true);
refreshChatsContainer();
FloatingActionButton fab = FloatingActionButton.
createFAB(FontImage.MATERIAL_CHAT);
fab.addActionListener(e -> new NewMessageForm().show());
return fab.bindFabToContainer(chats);
}
private Container createCameraView() {
if(ck != null) {
MainForm
chat.addActionListener(e -> new ChatForm(c, this).show());
}
chats.revalidate();
});
}
private Container createChatsContainer() {
chats = new Container(BoxLayout.y());
chats.setScrollableY(true);
refreshChatsContainer();
FloatingActionButton fab = FloatingActionButton.
createFAB(FontImage.MATERIAL_CHAT);
fab.addActionListener(e -> new NewMessageForm().show());
return fab.bindFabToContainer(chats);
}
private Container createCameraView() {
if(ck != null) {
MainForm
}
private Container createCameraView() {
if(ck != null) {
Container cameraCnt = new Container(new LayeredLayout());
tabs.addSelectionListener((oldSelected, newSelected) -> {
if(newSelected == 0) {
//ck.start();
//cameraCnt.add(ck.getView());
getToolbar().setHidden(true);
} else {
if(oldSelected == 0) {
//cameraCnt.removeAll();
//ck.stop();
getToolbar().setHidden(false);
}
}
});
return cameraCnt;
}
return BorderLayout.center(new Label("Camera Unsupported"));
MainForm
}
return BorderLayout.center(new Label("Camera Unsupported"));
}
private void showOverflowMenu() {
Button newGroup = new Button("New group", "Command");
Button newBroadcast = new Button("New broadcast", "Command");
Button whatsappWeb = new Button("WhatsApp Web", "Command");
Button starred = new Button("Starred Messages", "Command");
Button settings = new Button("Settings", "Command");
Container cnt = BoxLayout.encloseY(newGroup, newBroadcast,
whatsappWeb, starred, settings);
cnt.setUIID("CommandList");
Dialog dlg = new Dialog(new BorderLayout());
dlg.setDialogUIID("Container");
dlg.add(CENTER, cnt);
dlg.setDisposeWhenPointerOutOfBounds(true);
dlg.setTransitionInAnimator(CommonTransitions.createEmpty());
dlg.setTransitionOutAnimator(CommonTransitions.createEmpty());
dlg.setBackCommand("", null, e -> dlg.dispose());
int top = getUIManager().getComponentStyle("StatusBar").
getVerticalPadding();
setTintColor(0);
MainForm
}
return BorderLayout.center(new Label("Camera Unsupported"));
}
private void showOverflowMenu() {
Button newGroup = new Button("New group", "Command");
Button newBroadcast = new Button("New broadcast", "Command");
Button whatsappWeb = new Button("WhatsApp Web", "Command");
Button starred = new Button("Starred Messages", "Command");
Button settings = new Button("Settings", "Command");
Container cnt = BoxLayout.encloseY(newGroup, newBroadcast,
whatsappWeb, starred, settings);
cnt.setUIID("CommandList");
Dialog dlg = new Dialog(new BorderLayout());
dlg.setDialogUIID("Container");
dlg.add(CENTER, cnt);
dlg.setDisposeWhenPointerOutOfBounds(true);
dlg.setTransitionInAnimator(CommonTransitions.createEmpty());
dlg.setTransitionOutAnimator(CommonTransitions.createEmpty());
dlg.setBackCommand("", null, e -> dlg.dispose());
int top = getUIManager().getComponentStyle("StatusBar").
getVerticalPadding();
setTintColor(0);
MainForm
Button whatsappWeb = new Button("WhatsApp Web", "Command");
Button starred = new Button("Starred Messages", "Command");
Button settings = new Button("Settings", "Command");
Container cnt = BoxLayout.encloseY(newGroup, newBroadcast,
whatsappWeb, starred, settings);
cnt.setUIID("CommandList");
Dialog dlg = new Dialog(new BorderLayout());
dlg.setDialogUIID("Container");
dlg.add(CENTER, cnt);
dlg.setDisposeWhenPointerOutOfBounds(true);
dlg.setTransitionInAnimator(CommonTransitions.createEmpty());
dlg.setTransitionOutAnimator(CommonTransitions.createEmpty());
dlg.setBackCommand("", null, e -> dlg.dispose());
int top = getUIManager().getComponentStyle("StatusBar").
getVerticalPadding();
setTintColor(0);
int bottom = getHeight() - cnt.getPreferredH() - top -
cnt.getUnselectedStyle().getVerticalPadding() -
cnt.getUnselectedStyle().getVerticalMargins();
int w = getWidth();
int left = w - cnt.getPreferredW() -
cnt.getUnselectedStyle().getHorizontalPadding() -
cnt.getUnselectedStyle().getHorizontalMargins();
MainForm
Button whatsappWeb = new Button("WhatsApp Web", "Command");
Button starred = new Button("Starred Messages", "Command");
Button settings = new Button("Settings", "Command");
Container cnt = BoxLayout.encloseY(newGroup, newBroadcast,
whatsappWeb, starred, settings);
cnt.setUIID("CommandList");
Dialog dlg = new Dialog(new BorderLayout());
dlg.setDialogUIID("Container");
dlg.add(CENTER, cnt);
dlg.setDisposeWhenPointerOutOfBounds(true);
dlg.setTransitionInAnimator(CommonTransitions.createEmpty());
dlg.setTransitionOutAnimator(CommonTransitions.createEmpty());
dlg.setBackCommand("", null, e -> dlg.dispose());
int top = getUIManager().getComponentStyle("StatusBar").
getVerticalPadding();
setTintColor(0);
int bottom = getHeight() - cnt.getPreferredH() - top -
cnt.getUnselectedStyle().getVerticalPadding() -
cnt.getUnselectedStyle().getVerticalMargins();
int w = getWidth();
int left = w - cnt.getPreferredW() -
cnt.getUnselectedStyle().getHorizontalPadding() -
cnt.getUnselectedStyle().getHorizontalMargins();
MainForm
cnt.setUIID("CommandList");
Dialog dlg = new Dialog(new BorderLayout());
dlg.setDialogUIID("Container");
dlg.add(CENTER, cnt);
dlg.setDisposeWhenPointerOutOfBounds(true);
dlg.setTransitionInAnimator(CommonTransitions.createEmpty());
dlg.setTransitionOutAnimator(CommonTransitions.createEmpty());
dlg.setBackCommand("", null, e -> dlg.dispose());
int top = getUIManager().getComponentStyle("StatusBar").
getVerticalPadding();
setTintColor(0);
int bottom = getHeight() - cnt.getPreferredH() - top -
cnt.getUnselectedStyle().getVerticalPadding() -
cnt.getUnselectedStyle().getVerticalMargins();
int w = getWidth();
int left = w - cnt.getPreferredW() -
cnt.getUnselectedStyle().getHorizontalPadding() -
cnt.getUnselectedStyle().getHorizontalMargins();
dlg.show(top, bottom, left, 0);
}
private Container createTitleComponent(Container... scrollables) {
MainForm
cnt.setUIID("CommandList");
Dialog dlg = new Dialog(new BorderLayout());
dlg.setDialogUIID("Container");
dlg.add(CENTER, cnt);
dlg.setDisposeWhenPointerOutOfBounds(true);
dlg.setTransitionInAnimator(CommonTransitions.createEmpty());
dlg.setTransitionOutAnimator(CommonTransitions.createEmpty());
dlg.setBackCommand("", null, e -> dlg.dispose());
int top = getUIManager().getComponentStyle("StatusBar").
getVerticalPadding();
setTintColor(0);
int bottom = getHeight() - cnt.getPreferredH() - top -
cnt.getUnselectedStyle().getVerticalPadding() -
cnt.getUnselectedStyle().getVerticalMargins();
int w = getWidth();
int left = w - cnt.getPreferredW() -
cnt.getUnselectedStyle().getHorizontalPadding() -
cnt.getUnselectedStyle().getHorizontalMargins();
dlg.show(top, bottom, left, 0);
}
private Container createTitleComponent(Container... scrollables) {
MainForm
cnt.getUnselectedStyle().getVerticalMargins();
int w = getWidth();
int left = w - cnt.getPreferredW() -
cnt.getUnselectedStyle().getHorizontalPadding() -
cnt.getUnselectedStyle().getHorizontalMargins();
dlg.show(top, bottom, left, 0);
}
private Container createTitleComponent(Container... scrollables) {
Label title = new Label("WhatsApp", "Title");
Container titleArea;
if(title.getUnselectedStyle().getAlignment() == LEFT) {
titleArea = BorderLayout.center(title);
} else {
// for iOS we want the title to center properly
titleArea = BorderLayout.centerAbsolute(title);
}
Button search = new Button("", FontImage.MATERIAL_SEARCH, "Title");
Button overflow = new Button("", FontImage.MATERIAL_MORE_VERT,
"Title");
overflow.addActionListener(e -> showOverflowMenu());
MainForm
cnt.getUnselectedStyle().getVerticalMargins();
int w = getWidth();
int left = w - cnt.getPreferredW() -
cnt.getUnselectedStyle().getHorizontalPadding() -
cnt.getUnselectedStyle().getHorizontalMargins();
dlg.show(top, bottom, left, 0);
}
private Container createTitleComponent(Container... scrollables) {
Label title = new Label("WhatsApp", "Title");
Container titleArea;
if(title.getUnselectedStyle().getAlignment() == LEFT) {
titleArea = BorderLayout.center(title);
} else {
// for iOS we want the title to center properly
titleArea = BorderLayout.centerAbsolute(title);
}
Button search = new Button("", FontImage.MATERIAL_SEARCH, "Title");
Button overflow = new Button("", FontImage.MATERIAL_MORE_VERT,
"Title");
overflow.addActionListener(e -> showOverflowMenu());
MainForm
if(title.getUnselectedStyle().getAlignment() == LEFT) {
titleArea = BorderLayout.center(title);
} else {
// for iOS we want the title to center properly
titleArea = BorderLayout.centerAbsolute(title);
}
Button search = new Button("", FontImage.MATERIAL_SEARCH, "Title");
Button overflow = new Button("", FontImage.MATERIAL_MORE_VERT,
"Title");
overflow.addActionListener(e -> showOverflowMenu());
titleArea.add(EAST, GridLayout.encloseIn(2, search, overflow));
ButtonGroup bg = new ButtonGroup();
RadioButton camera = RadioButton.createToggle("", bg);
camera.setUIID("SubTitle");
FontImage.setMaterialIcon(camera, FontImage.MATERIAL_CAMERA_ALT);
RadioButton chats = RadioButton.createToggle("Chats", bg);
RadioButton status = RadioButton.createToggle("Status", bg);
RadioButton calls = RadioButton.createToggle("Calls", bg);
chats.setUIID("SubTitle");
status.setUIID("SubTitle");
calls.setUIID("SubTitle");
MainForm
Button search = new Button("", FontImage.MATERIAL_SEARCH, "Title");
Button overflow = new Button("", FontImage.MATERIAL_MORE_VERT,
"Title");
overflow.addActionListener(e -> showOverflowMenu());
titleArea.add(EAST, GridLayout.encloseIn(2, search, overflow));
ButtonGroup bg = new ButtonGroup();
RadioButton camera = RadioButton.createToggle("", bg);
camera.setUIID("SubTitle");
FontImage.setMaterialIcon(camera, FontImage.MATERIAL_CAMERA_ALT);
RadioButton chats = RadioButton.createToggle("Chats", bg);
RadioButton status = RadioButton.createToggle("Status", bg);
RadioButton calls = RadioButton.createToggle("Calls", bg);
chats.setUIID("SubTitle");
status.setUIID("SubTitle");
calls.setUIID("SubTitle");
RadioButton[] buttons = new RadioButton[] {
camera, chats, status, calls
};
TableLayout tb = new TableLayout(2, 4);
Container toggles = new Container(tb);
MainForm
status.setUIID("SubTitle");
calls.setUIID("SubTitle");
RadioButton[] buttons = new RadioButton[] {
camera, chats, status, calls
};
TableLayout tb = new TableLayout(2, 4);
Container toggles = new Container(tb);
toggles.add(tb.createConstraint().widthPercentage(10), camera);
toggles.add(tb.createConstraint().widthPercentage(30), chats);
toggles.add(tb.createConstraint().widthPercentage(30), status);
toggles.add(tb.createConstraint().widthPercentage(30), calls);
Label whiteLine = new Label("", "SubTitleUnderline");
whiteLine.setShowEvenIfBlank(true);
toggles.add(tb.createConstraint(1, 1) ,whiteLine);
final Container finalTitle = titleArea;
for(int iter = 0 ; iter < buttons.length ; iter++) {
final int current = iter;
buttons[iter].addActionListener(e -> {
MainForm
TableLayout tb = new TableLayout(2, 4);
Container toggles = new Container(tb);
toggles.add(tb.createConstraint().widthPercentage(10), camera);
toggles.add(tb.createConstraint().widthPercentage(30), chats);
toggles.add(tb.createConstraint().widthPercentage(30), status);
toggles.add(tb.createConstraint().widthPercentage(30), calls);
Label whiteLine = new Label("", "SubTitleUnderline");
whiteLine.setShowEvenIfBlank(true);
toggles.add(tb.createConstraint(1, 1) ,whiteLine);
final Container finalTitle = titleArea;
for(int iter = 0 ; iter < buttons.length ; iter++) {
final int current = iter;
buttons[iter].addActionListener(e -> {
tabs.setSelectedIndex(current);
whiteLine.remove();
toggles.add(tb.createConstraint(1, current) ,whiteLine);
finalTitle.setPreferredSize(null);
toggles.animateLayout(100);
});
}
MainForm
Label whiteLine = new Label("", "SubTitleUnderline");
whiteLine.setShowEvenIfBlank(true);
toggles.add(tb.createConstraint(1, 1) ,whiteLine);
final Container finalTitle = titleArea;
for(int iter = 0 ; iter < buttons.length ; iter++) {
final int current = iter;
buttons[iter].addActionListener(e -> {
tabs.setSelectedIndex(current);
whiteLine.remove();
toggles.add(tb.createConstraint(1, current) ,whiteLine);
finalTitle.setPreferredSize(null);
toggles.animateLayout(100);
});
}
tabs.addSelectionListener((oldSelected, newSelected) -> {
if(!buttons[newSelected].isSelected()) {
finalTitle.setPreferredSize(null);
buttons[newSelected].setSelected(true);
whiteLine.remove();
toggles.add(tb.createConstraint(1, newSelected) ,whiteLine);
MainForm
Label whiteLine = new Label("", "SubTitleUnderline");
whiteLine.setShowEvenIfBlank(true);
toggles.add(tb.createConstraint(1, 1) ,whiteLine);
final Container finalTitle = titleArea;
for(int iter = 0 ; iter < buttons.length ; iter++) {
final int current = iter;
buttons[iter].addActionListener(e -> {
tabs.setSelectedIndex(current);
whiteLine.remove();
toggles.add(tb.createConstraint(1, current) ,whiteLine);
finalTitle.setPreferredSize(null);
toggles.animateLayout(100);
});
}
tabs.addSelectionListener((oldSelected, newSelected) -> {
if(!buttons[newSelected].isSelected()) {
finalTitle.setPreferredSize(null);
buttons[newSelected].setSelected(true);
whiteLine.remove();
toggles.add(tb.createConstraint(1, newSelected) ,whiteLine);
MainForm
Label whiteLine = new Label("", "SubTitleUnderline");
whiteLine.setShowEvenIfBlank(true);
toggles.add(tb.createConstraint(1, 1) ,whiteLine);
final Container finalTitle = titleArea;
for(int iter = 0 ; iter < buttons.length ; iter++) {
final int current = iter;
buttons[iter].addActionListener(e -> {
tabs.setSelectedIndex(current);
whiteLine.remove();
toggles.add(tb.createConstraint(1, current) ,whiteLine);
finalTitle.setPreferredSize(null);
toggles.animateLayout(100);
});
}
tabs.addSelectionListener((oldSelected, newSelected) -> {
if(!buttons[newSelected].isSelected()) {
finalTitle.setPreferredSize(null);
buttons[newSelected].setSelected(true);
whiteLine.remove();
toggles.add(tb.createConstraint(1, newSelected) ,whiteLine);
MainForm
Label whiteLine = new Label("", "SubTitleUnderline");
whiteLine.setShowEvenIfBlank(true);
toggles.add(tb.createConstraint(1, 1) ,whiteLine);
final Container finalTitle = titleArea;
for(int iter = 0 ; iter < buttons.length ; iter++) {
final int current = iter;
buttons[iter].addActionListener(e -> {
tabs.setSelectedIndex(current);
whiteLine.remove();
toggles.add(tb.createConstraint(1, current) ,whiteLine);
finalTitle.setPreferredSize(null);
toggles.animateLayout(100);
});
}
tabs.addSelectionListener((oldSelected, newSelected) -> {
if(!buttons[newSelected].isSelected()) {
finalTitle.setPreferredSize(null);
buttons[newSelected].setSelected(true);
whiteLine.remove();
toggles.add(tb.createConstraint(1, newSelected) ,whiteLine);
MainForm
Label whiteLine = new Label("", "SubTitleUnderline");
whiteLine.setShowEvenIfBlank(true);
toggles.add(tb.createConstraint(1, 1) ,whiteLine);
final Container finalTitle = titleArea;
for(int iter = 0 ; iter < buttons.length ; iter++) {
final int current = iter;
buttons[iter].addActionListener(e -> {
tabs.setSelectedIndex(current);
whiteLine.remove();
toggles.add(tb.createConstraint(1, current) ,whiteLine);
finalTitle.setPreferredSize(null);
toggles.animateLayout(100);
});
}
tabs.addSelectionListener((oldSelected, newSelected) -> {
if(!buttons[newSelected].isSelected()) {
finalTitle.setPreferredSize(null);
buttons[newSelected].setSelected(true);
whiteLine.remove();
toggles.add(tb.createConstraint(1, newSelected) ,whiteLine);
MainForm
whiteLine.remove();
toggles.add(tb.createConstraint(1, current) ,whiteLine);
finalTitle.setPreferredSize(null);
toggles.animateLayout(100);
});
}
tabs.addSelectionListener((oldSelected, newSelected) -> {
if(!buttons[newSelected].isSelected()) {
finalTitle.setPreferredSize(null);
buttons[newSelected].setSelected(true);
whiteLine.remove();
toggles.add(tb.createConstraint(1, newSelected) ,whiteLine);
toggles.animateLayout(100);
}
});
bindFolding(titleArea, titleArea.getPreferredH(), scrollables);
return BoxLayout.encloseY(titleArea, toggles);
}
private void bindFolding(Container titleArea, int titleHeight,
MainForm
whiteLine.remove();
toggles.add(tb.createConstraint(1, current) ,whiteLine);
finalTitle.setPreferredSize(null);
toggles.animateLayout(100);
});
}
tabs.addSelectionListener((oldSelected, newSelected) -> {
if(!buttons[newSelected].isSelected()) {
finalTitle.setPreferredSize(null);
buttons[newSelected].setSelected(true);
whiteLine.remove();
toggles.add(tb.createConstraint(1, newSelected) ,whiteLine);
toggles.animateLayout(100);
}
});
bindFolding(titleArea, titleArea.getPreferredH(), scrollables);
return BoxLayout.encloseY(titleArea, toggles);
}
private void bindFolding(Container titleArea, int titleHeight,
MainForm
whiteLine.remove();
toggles.add(tb.createConstraint(1, current) ,whiteLine);
finalTitle.setPreferredSize(null);
toggles.animateLayout(100);
});
}
tabs.addSelectionListener((oldSelected, newSelected) -> {
if(!buttons[newSelected].isSelected()) {
finalTitle.setPreferredSize(null);
buttons[newSelected].setSelected(true);
whiteLine.remove();
toggles.add(tb.createConstraint(1, newSelected) ,whiteLine);
toggles.animateLayout(100);
}
});
bindFolding(titleArea, titleArea.getPreferredH(), scrollables);
return BoxLayout.encloseY(titleArea, toggles);
}
private void bindFolding(Container titleArea, int titleHeight,
MainForm
whiteLine.remove();
toggles.add(tb.createConstraint(1, current) ,whiteLine);
finalTitle.setPreferredSize(null);
toggles.animateLayout(100);
});
}
tabs.addSelectionListener((oldSelected, newSelected) -> {
if(!buttons[newSelected].isSelected()) {
finalTitle.setPreferredSize(null);
buttons[newSelected].setSelected(true);
whiteLine.remove();
toggles.add(tb.createConstraint(1, newSelected) ,whiteLine);
toggles.animateLayout(100);
}
});
bindFolding(titleArea, titleArea.getPreferredH(), scrollables);
return BoxLayout.encloseY(titleArea, toggles);
}
private void bindFolding(Container titleArea, int titleHeight,
MainForm
tabs.addSelectionListener((oldSelected, newSelected) -> {
if(!buttons[newSelected].isSelected()) {
finalTitle.setPreferredSize(null);
buttons[newSelected].setSelected(true);
whiteLine.remove();
toggles.add(tb.createConstraint(1, newSelected) ,whiteLine);
toggles.animateLayout(100);
}
});
bindFolding(titleArea, titleArea.getPreferredH(), scrollables);
return BoxLayout.encloseY(titleArea, toggles);
}
private void bindFolding(Container titleArea, int titleHeight,
Container... scrollables) {
addPointerReleasedListener(e -> {
if(titleArea.getHeight() != titleHeight &&
titleArea.getHeight() != 0) {
if(titleHeight - titleArea.getHeight() > titleHeight / 2) {
MainForm
tabs.addSelectionListener((oldSelected, newSelected) -> {
if(!buttons[newSelected].isSelected()) {
finalTitle.setPreferredSize(null);
buttons[newSelected].setSelected(true);
whiteLine.remove();
toggles.add(tb.createConstraint(1, newSelected) ,whiteLine);
toggles.animateLayout(100);
}
});
bindFolding(titleArea, titleArea.getPreferredH(), scrollables);
return BoxLayout.encloseY(titleArea, toggles);
}
private void bindFolding(Container titleArea, int titleHeight,
Container... scrollables) {
addPointerReleasedListener(e -> {
if(titleArea.getHeight() != titleHeight &&
titleArea.getHeight() != 0) {
if(titleHeight - titleArea.getHeight() > titleHeight / 2) {
MainForm
return BoxLayout.encloseY(titleArea, toggles);
}
private void bindFolding(Container titleArea, int titleHeight,
Container... scrollables) {
addPointerReleasedListener(e -> {
if(titleArea.getHeight() != titleHeight &&
titleArea.getHeight() != 0) {
if(titleHeight - titleArea.getHeight() > titleHeight / 2) {
titleArea.setPreferredSize(null);
} else {
titleArea.setPreferredH(0);
}
titleArea.getParent().animateLayout(100);
}
});
for(Container c : scrollables) {
c.addScrollListener((scrollX, scrollY, oldscrollX,
oldscrollY) -> {
// special case for tensile drag
if(scrollY <= 10) {
MainForm
return BoxLayout.encloseY(titleArea, toggles);
}
private void bindFolding(Container titleArea, int titleHeight,
Container... scrollables) {
addPointerReleasedListener(e -> {
if(titleArea.getHeight() != titleHeight &&
titleArea.getHeight() != 0) {
if(titleHeight - titleArea.getHeight() > titleHeight / 2) {
titleArea.setPreferredSize(null);
} else {
titleArea.setPreferredH(0);
}
titleArea.getParent().animateLayout(100);
}
});
for(Container c : scrollables) {
c.addScrollListener((scrollX, scrollY, oldscrollX,
oldscrollY) -> {
// special case for tensile drag
if(scrollY <= 10) {
MainForm
return BoxLayout.encloseY(titleArea, toggles);
}
private void bindFolding(Container titleArea, int titleHeight,
Container... scrollables) {
addPointerReleasedListener(e -> {
if(titleArea.getHeight() != titleHeight &&
titleArea.getHeight() != 0) {
if(titleHeight - titleArea.getHeight() > titleHeight / 2) {
titleArea.setPreferredSize(null);
} else {
titleArea.setPreferredH(0);
}
titleArea.getParent().animateLayout(100);
}
});
for(Container c : scrollables) {
c.addScrollListener((scrollX, scrollY, oldscrollX,
oldscrollY) -> {
// special case for tensile drag
if(scrollY <= 10) {
MainForm
return BoxLayout.encloseY(titleArea, toggles);
}
private void bindFolding(Container titleArea, int titleHeight,
Container... scrollables) {
addPointerReleasedListener(e -> {
if(titleArea.getHeight() != titleHeight &&
titleArea.getHeight() != 0) {
if(titleHeight - titleArea.getHeight() > titleHeight / 2) {
titleArea.setPreferredSize(null);
} else {
titleArea.setPreferredH(0);
}
titleArea.getParent().animateLayout(100);
}
});
for(Container c : scrollables) {
c.addScrollListener((scrollX, scrollY, oldscrollX,
oldscrollY) -> {
// special case for tensile drag
if(scrollY <= 10) {
MainForm
return BoxLayout.encloseY(titleArea, toggles);
}
private void bindFolding(Container titleArea, int titleHeight,
Container... scrollables) {
addPointerReleasedListener(e -> {
if(titleArea.getHeight() != titleHeight &&
titleArea.getHeight() != 0) {
if(titleHeight - titleArea.getHeight() > titleHeight / 2) {
titleArea.setPreferredSize(null);
} else {
titleArea.setPreferredH(0);
}
titleArea.getParent().animateLayout(100);
}
});
for(Container c : scrollables) {
c.addScrollListener((scrollX, scrollY, oldscrollX,
oldscrollY) -> {
// special case for tensile drag
if(scrollY <= 10) {
MainForm
return BoxLayout.encloseY(titleArea, toggles);
}
private void bindFolding(Container titleArea, int titleHeight,
Container... scrollables) {
addPointerReleasedListener(e -> {
if(titleArea.getHeight() != titleHeight &&
titleArea.getHeight() != 0) {
if(titleHeight - titleArea.getHeight() > titleHeight / 2) {
titleArea.setPreferredSize(null);
} else {
titleArea.setPreferredH(0);
}
titleArea.getParent().animateLayout(100);
}
});
for(Container c : scrollables) {
c.addScrollListener((scrollX, scrollY, oldscrollX,
oldscrollY) -> {
// special case for tensile drag
if(scrollY <= 10) {
MainForm
return BoxLayout.encloseY(titleArea, toggles);
}
private void bindFolding(Container titleArea, int titleHeight,
Container... scrollables) {
addPointerReleasedListener(e -> {
if(titleArea.getHeight() != titleHeight &&
titleArea.getHeight() != 0) {
if(titleHeight - titleArea.getHeight() > titleHeight / 2) {
titleArea.setPreferredSize(null);
} else {
titleArea.setPreferredH(0);
}
titleArea.getParent().animateLayout(100);
}
});
for(Container c : scrollables) {
c.addScrollListener((scrollX, scrollY, oldscrollX,
oldscrollY) -> {
// special case for tensile drag
if(scrollY <= 10) {
MainForm
}
titleArea.getParent().animateLayout(100);
}
});
for(Container c : scrollables) {
c.addScrollListener((scrollX, scrollY, oldscrollX,
oldscrollY) -> {
// special case for tensile drag
if(scrollY <= 10) {
titleArea.setPreferredSize(null);
return;
}
int diff = oldscrollY - scrollY;
if(diff > 0) {
if(titleArea.getHeight() < titleHeight) {
titleArea.setPreferredH(Math.min(titleHeight,
titleArea.getPreferredH() + diff));
titleArea.setHeight(titleArea.getPreferredH());
titleArea.getParent().revalidate();
}
} else {
if(diff < 0) {
MainForm
}
titleArea.getParent().animateLayout(100);
}
});
for(Container c : scrollables) {
c.addScrollListener((scrollX, scrollY, oldscrollX,
oldscrollY) -> {
// special case for tensile drag
if(scrollY <= 10) {
titleArea.setPreferredSize(null);
return;
}
int diff = oldscrollY - scrollY;
if(diff > 0) {
if(titleArea.getHeight() < titleHeight) {
titleArea.setPreferredH(Math.min(titleHeight,
titleArea.getPreferredH() + diff));
titleArea.setHeight(titleArea.getPreferredH());
titleArea.getParent().revalidate();
}
} else {
if(diff < 0) {
MainForm
if(scrollY <= 10) {
titleArea.setPreferredSize(null);
return;
}
int diff = oldscrollY - scrollY;
if(diff > 0) {
if(titleArea.getHeight() < titleHeight) {
titleArea.setPreferredH(Math.min(titleHeight,
titleArea.getPreferredH() + diff));
titleArea.setHeight(titleArea.getPreferredH());
titleArea.getParent().revalidate();
}
} else {
if(diff < 0) {
if(titleArea.getHeight() > 0) {
titleArea.setPreferredH(Math.max(0,
titleArea.getPreferredH() + diff));
titleArea.setHeight(titleArea.getPreferredH());
titleArea.getParent().revalidate();
}
}
}
MainForm
if(scrollY <= 10) {
titleArea.setPreferredSize(null);
return;
}
int diff = oldscrollY - scrollY;
if(diff > 0) {
if(titleArea.getHeight() < titleHeight) {
titleArea.setPreferredH(Math.min(titleHeight,
titleArea.getPreferredH() + diff));
titleArea.setHeight(titleArea.getPreferredH());
titleArea.getParent().revalidate();
}
} else {
if(diff < 0) {
if(titleArea.getHeight() > 0) {
titleArea.setPreferredH(Math.max(0,
titleArea.getPreferredH() + diff));
titleArea.setHeight(titleArea.getPreferredH());
titleArea.getParent().revalidate();
}
}
}
MainForm
int diff = oldscrollY - scrollY;
if(diff > 0) {
if(titleArea.getHeight() < titleHeight) {
titleArea.setPreferredH(Math.min(titleHeight,
titleArea.getPreferredH() + diff));
titleArea.setHeight(titleArea.getPreferredH());
titleArea.getParent().revalidate();
}
} else {
if(diff < 0) {
if(titleArea.getHeight() > 0) {
titleArea.setPreferredH(Math.max(0,
titleArea.getPreferredH() + diff));
titleArea.setHeight(titleArea.getPreferredH());
titleArea.getParent().revalidate();
}
}
}
});
}
}
MainForm
} else {
if(diff < 0) {
if(titleArea.getHeight() > 0) {
titleArea.setPreferredH(Math.max(0,
titleArea.getPreferredH() + diff));
titleArea.setHeight(titleArea.getPreferredH());
titleArea.getParent().revalidate();
}
}
}
});
}
}
@Override
protected void initGlobalToolbar() {
Toolbar tb = new Toolbar();
tb.setTitleCentered(false);
setToolbar(tb);
}
}
MainForm

More Related Content

PDF
Creating a Whatsapp Clone - Part V - Transcript.pdf
PDF
Creating a Facebook Clone - Part XXX.pdf
PDF
Creating a Whatsapp Clone - Part IX.pdf
PDF
Creating a Whatsapp Clone - Part IX - Transcript.pdf
PDF
Creating a Whatsapp Clone - Part X.pdf
PDF
Creating a Facebook Clone - Part XLIII.pdf
PDF
Creating a Facebook Clone - Part XLIII - Transcript.pdf
PDF
Creating a Whatsapp Clone - Part X - Transcript.pdf
Creating a Whatsapp Clone - Part V - Transcript.pdf
Creating a Facebook Clone - Part XXX.pdf
Creating a Whatsapp Clone - Part IX.pdf
Creating a Whatsapp Clone - Part IX - Transcript.pdf
Creating a Whatsapp Clone - Part X.pdf
Creating a Facebook Clone - Part XLIII.pdf
Creating a Facebook Clone - Part XLIII - Transcript.pdf
Creating a Whatsapp Clone - Part X - Transcript.pdf

Similar to Creating a Whatsapp Clone - Part V.pdf (8)

PDF
Creating a Facebook Clone - Part XXX - Transcript.pdf
PDF
Creating a Facebook Clone - Part XXXVI.pdf
PDF
Creating a Facebook Clone - Part XVI - Transcript.pdf
PDF
Creating a Facebook Clone - Part IX.pdf
PDF
Creating a Facebook Clone - Part XLVI.pdf
PDF
Creating a Facebook Clone - Part VI.pdf
PDF
Creating a Facebook Clone - Part XVI.pdf
PDF
Creating a Facebook Clone - Part XXXVI - Transcript.pdf
Creating a Facebook Clone - Part XXX - Transcript.pdf
Creating a Facebook Clone - Part XXXVI.pdf
Creating a Facebook Clone - Part XVI - Transcript.pdf
Creating a Facebook Clone - Part IX.pdf
Creating a Facebook Clone - Part XLVI.pdf
Creating a Facebook Clone - Part VI.pdf
Creating a Facebook Clone - Part XVI.pdf
Creating a Facebook Clone - Part XXXVI - Transcript.pdf
Ad

More from ShaiAlmog1 (20)

PDF
The Duck Teaches Learn to debug from the masters. Local to production- kill ...
PDF
create-netflix-clone-06-client-ui.pdf
PDF
create-netflix-clone-01-introduction_transcript.pdf
PDF
create-netflix-clone-02-server_transcript.pdf
PDF
create-netflix-clone-04-server-continued_transcript.pdf
PDF
create-netflix-clone-01-introduction.pdf
PDF
create-netflix-clone-06-client-ui_transcript.pdf
PDF
create-netflix-clone-03-server.pdf
PDF
create-netflix-clone-04-server-continued.pdf
PDF
create-netflix-clone-05-client-model_transcript.pdf
PDF
create-netflix-clone-03-server_transcript.pdf
PDF
create-netflix-clone-02-server.pdf
PDF
create-netflix-clone-05-client-model.pdf
PDF
Creating a Whatsapp Clone - Part II.pdf
PDF
Creating a Whatsapp Clone - Part II - Transcript.pdf
PDF
Creating a Whatsapp Clone - Part IV - Transcript.pdf
PDF
Creating a Whatsapp Clone - Part IV.pdf
PDF
Creating a Whatsapp Clone - Part I - Transcript.pdf
PDF
Creating a Whatsapp Clone - Part VI.pdf
PDF
Creating a Whatsapp Clone - Part III - Transcript.pdf
The Duck Teaches Learn to debug from the masters. Local to production- kill ...
create-netflix-clone-06-client-ui.pdf
create-netflix-clone-01-introduction_transcript.pdf
create-netflix-clone-02-server_transcript.pdf
create-netflix-clone-04-server-continued_transcript.pdf
create-netflix-clone-01-introduction.pdf
create-netflix-clone-06-client-ui_transcript.pdf
create-netflix-clone-03-server.pdf
create-netflix-clone-04-server-continued.pdf
create-netflix-clone-05-client-model_transcript.pdf
create-netflix-clone-03-server_transcript.pdf
create-netflix-clone-02-server.pdf
create-netflix-clone-05-client-model.pdf
Creating a Whatsapp Clone - Part II.pdf
Creating a Whatsapp Clone - Part II - Transcript.pdf
Creating a Whatsapp Clone - Part IV - Transcript.pdf
Creating a Whatsapp Clone - Part IV.pdf
Creating a Whatsapp Clone - Part I - Transcript.pdf
Creating a Whatsapp Clone - Part VI.pdf
Creating a Whatsapp Clone - Part III - Transcript.pdf
Ad

Recently uploaded (20)

PDF
KodekX | Application Modernization Development
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
Cloud computing and distributed systems.
PPTX
sap open course for s4hana steps from ECC to s4
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
Review of recent advances in non-invasive hemoglobin estimation
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Approach and Philosophy of On baking technology
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
KodekX | Application Modernization Development
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Reach Out and Touch Someone: Haptics and Empathic Computing
Encapsulation_ Review paper, used for researhc scholars
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Per capita expenditure prediction using model stacking based on satellite ima...
Cloud computing and distributed systems.
sap open course for s4hana steps from ECC to s4
MIND Revenue Release Quarter 2 2025 Press Release
Review of recent advances in non-invasive hemoglobin estimation
Programs and apps: productivity, graphics, security and other tools
Spectral efficient network and resource selection model in 5G networks
Mobile App Security Testing_ A Comprehensive Guide.pdf
Network Security Unit 5.pdf for BCA BBA.
Approach and Philosophy of On baking technology
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
The AUB Centre for AI in Media Proposal.docx
NewMind AI Weekly Chronicles - August'25 Week I
Digital-Transformation-Roadmap-for-Companies.pptx
Build a system with the filesystem maintained by OSTree @ COSCUP 2025

Creating a Whatsapp Clone - Part V.pdf

  • 1. Creating a WhatsApp Clone - Part V
  • 2. public class MainForm extends Form { private Tabs tabs = new Tabs(); private CameraKit ck; private Container chats; private Container status; private Container calls; private static MainForm instance; public MainForm() { super("WhatsApp Clone", new BorderLayout()); instance = this; add(CENTER, tabs); tabs.hideTabs(); ck = CameraKit.create(); tabs.addTab("", createCameraView()); tabs.addTab("", createChatsContainer()); tabs.addTab("", createStatusContainer()); MainForm
  • 3. public class MainForm extends Form { private Tabs tabs = new Tabs(); private CameraKit ck; private Container chats; private Container status; private Container calls; private static MainForm instance; public MainForm() { super("WhatsApp Clone", new BorderLayout()); instance = this; add(CENTER, tabs); tabs.hideTabs(); ck = CameraKit.create(); tabs.addTab("", createCameraView()); tabs.addTab("", createChatsContainer()); tabs.addTab("", createStatusContainer()); MainForm
  • 4. public class MainForm extends Form { private Tabs tabs = new Tabs(); private CameraKit ck; private Container chats; private Container status; private Container calls; private static MainForm instance; public MainForm() { super("WhatsApp Clone", new BorderLayout()); instance = this; add(CENTER, tabs); tabs.hideTabs(); ck = CameraKit.create(); tabs.addTab("", createCameraView()); tabs.addTab("", createChatsContainer()); tabs.addTab("", createStatusContainer()); MainForm
  • 5. public class MainForm extends Form { private Tabs tabs = new Tabs(); private CameraKit ck; private Container chats; private Container status; private Container calls; private static MainForm instance; public MainForm() { super("WhatsApp Clone", new BorderLayout()); instance = this; add(CENTER, tabs); tabs.hideTabs(); ck = CameraKit.create(); tabs.addTab("", createCameraView()); tabs.addTab("", createChatsContainer()); tabs.addTab("", createStatusContainer()); MainForm
  • 6. public class MainForm extends Form { private Tabs tabs = new Tabs(); private CameraKit ck; private Container chats; private Container status; private Container calls; private static MainForm instance; public MainForm() { super("WhatsApp Clone", new BorderLayout()); instance = this; add(CENTER, tabs); tabs.hideTabs(); ck = CameraKit.create(); tabs.addTab("", createCameraView()); tabs.addTab("", createChatsContainer()); tabs.addTab("", createStatusContainer()); MainForm
  • 7. private Container status; private Container calls; private static MainForm instance; public MainForm() { super("WhatsApp Clone", new BorderLayout()); instance = this; add(CENTER, tabs); tabs.hideTabs(); ck = CameraKit.create(); tabs.addTab("", createCameraView()); tabs.addTab("", createChatsContainer()); tabs.addTab("", createStatusContainer()); tabs.addTab("", createCallsContainer()); tabs.setSelectedIndex(1); Toolbar tb = getToolbar(); tb.setTitleComponent(createTitleComponent(chats, status, calls)); setBackCommand("", null, e -> { if(tabs.getSelectedIndex() != 1) { tabs.setSelectedIndex(1); MainForm
  • 8. private Container status; private Container calls; private static MainForm instance; public MainForm() { super("WhatsApp Clone", new BorderLayout()); instance = this; add(CENTER, tabs); tabs.hideTabs(); ck = CameraKit.create(); tabs.addTab("", createCameraView()); tabs.addTab("", createChatsContainer()); tabs.addTab("", createStatusContainer()); tabs.addTab("", createCallsContainer()); tabs.setSelectedIndex(1); Toolbar tb = getToolbar(); tb.setTitleComponent(createTitleComponent(chats, status, calls)); setBackCommand("", null, e -> { if(tabs.getSelectedIndex() != 1) { tabs.setSelectedIndex(1); MainForm
  • 9. private Container status; private Container calls; private static MainForm instance; public MainForm() { super("WhatsApp Clone", new BorderLayout()); instance = this; add(CENTER, tabs); tabs.hideTabs(); ck = CameraKit.create(); tabs.addTab("", createCameraView()); tabs.addTab("", createChatsContainer()); tabs.addTab("", createStatusContainer()); tabs.addTab("", createCallsContainer()); tabs.setSelectedIndex(1); Toolbar tb = getToolbar(); tb.setTitleComponent(createTitleComponent(chats, status, calls)); setBackCommand("", null, e -> { if(tabs.getSelectedIndex() != 1) { tabs.setSelectedIndex(1); MainForm
  • 10. tabs.addTab("", createCameraView()); tabs.addTab("", createChatsContainer()); tabs.addTab("", createStatusContainer()); tabs.addTab("", createCallsContainer()); tabs.setSelectedIndex(1); Toolbar tb = getToolbar(); tb.setTitleComponent(createTitleComponent(chats, status, calls)); setBackCommand("", null, e -> { if(tabs.getSelectedIndex() != 1) { tabs.setSelectedIndex(1); } else { minimizeApplication(); } }); } public static MainForm getInstance() { return instance; } private Container createCallsContainer() { MainForm
  • 11. tabs.addTab("", createCameraView()); tabs.addTab("", createChatsContainer()); tabs.addTab("", createStatusContainer()); tabs.addTab("", createCallsContainer()); tabs.setSelectedIndex(1); Toolbar tb = getToolbar(); tb.setTitleComponent(createTitleComponent(chats, status, calls)); setBackCommand("", null, e -> { if(tabs.getSelectedIndex() != 1) { tabs.setSelectedIndex(1); } else { minimizeApplication(); } }); } public static MainForm getInstance() { return instance; } private Container createCallsContainer() { MainForm
  • 12. } public static MainForm getInstance() { return instance; } private Container createCallsContainer() { Container cnt = new Container(BoxLayout.y()); calls = cnt; cnt.setScrollableY(true); MultiButton chat = new MultiButton("Person"); chat.setTextLine2("Date & time"); cnt.add(chat); FloatingActionButton fab = FloatingActionButton. createFAB(FontImage.MATERIAL_CALL); return fab.bindFabToContainer(cnt); } private Container createStatusContainer() { Container cnt = new Container(BoxLayout.y()); status = cnt; MainForm
  • 13. } public static MainForm getInstance() { return instance; } private Container createCallsContainer() { Container cnt = new Container(BoxLayout.y()); calls = cnt; cnt.setScrollableY(true); MultiButton chat = new MultiButton("Person"); chat.setTextLine2("Date & time"); cnt.add(chat); FloatingActionButton fab = FloatingActionButton. createFAB(FontImage.MATERIAL_CALL); return fab.bindFabToContainer(cnt); } private Container createStatusContainer() { Container cnt = new Container(BoxLayout.y()); status = cnt; MainForm
  • 14. FloatingActionButton fab = FloatingActionButton. createFAB(FontImage.MATERIAL_CALL); return fab.bindFabToContainer(cnt); } private Container createStatusContainer() { Container cnt = new Container(BoxLayout.y()); status = cnt; cnt.setScrollableY(true); MultiButton chat = new MultiButton("My Status"); chat.setTextLine2("Tap to add status update"); cnt.add(chat); FloatingActionButton fab = FloatingActionButton. createFAB(FontImage.MATERIAL_CAMERA_ALT); return fab.bindFabToContainer(cnt); } public void refreshChatsContainer() { Server.fetchChatList(contacts -> { chats.removeAll(); MainForm
  • 15. return fab.bindFabToContainer(cnt); } public void refreshChatsContainer() { Server.fetchChatList(contacts -> { chats.removeAll(); for(ChatContact c : contacts) { MultiButton chat = new MultiButton(c.name.get()); chat.setTextLine2(c.tagline.get()); if(chat.getTextLine2() == null || chat.getTextLine2().length() == 0) { chat.setTextLine2("..."); } chat.setIcon(c.getLargeIcon()); chats.add(chat); chat.addActionListener(e -> new ChatForm(c, this).show()); } chats.revalidate(); }); } MainForm
  • 16. return fab.bindFabToContainer(cnt); } public void refreshChatsContainer() { Server.fetchChatList(contacts -> { chats.removeAll(); for(ChatContact c : contacts) { MultiButton chat = new MultiButton(c.name.get()); chat.setTextLine2(c.tagline.get()); if(chat.getTextLine2() == null || chat.getTextLine2().length() == 0) { chat.setTextLine2("..."); } chat.setIcon(c.getLargeIcon()); chats.add(chat); chat.addActionListener(e -> new ChatForm(c, this).show()); } chats.revalidate(); }); } MainForm
  • 17. return fab.bindFabToContainer(cnt); } public void refreshChatsContainer() { Server.fetchChatList(contacts -> { chats.removeAll(); for(ChatContact c : contacts) { MultiButton chat = new MultiButton(c.name.get()); chat.setTextLine2(c.tagline.get()); if(chat.getTextLine2() == null || chat.getTextLine2().length() == 0) { chat.setTextLine2("..."); } chat.setIcon(c.getLargeIcon()); chats.add(chat); chat.addActionListener(e -> new ChatForm(c, this).show()); } chats.revalidate(); }); } MainForm
  • 18. return fab.bindFabToContainer(cnt); } public void refreshChatsContainer() { Server.fetchChatList(contacts -> { chats.removeAll(); for(ChatContact c : contacts) { MultiButton chat = new MultiButton(c.name.get()); chat.setTextLine2(c.tagline.get()); if(chat.getTextLine2() == null || chat.getTextLine2().length() == 0) { chat.setTextLine2("..."); } chat.setIcon(c.getLargeIcon()); chats.add(chat); chat.addActionListener(e -> new ChatForm(c, this).show()); } chats.revalidate(); }); } MainForm
  • 19. return fab.bindFabToContainer(cnt); } public void refreshChatsContainer() { Server.fetchChatList(contacts -> { chats.removeAll(); for(ChatContact c : contacts) { MultiButton chat = new MultiButton(c.name.get()); chat.setTextLine2(c.tagline.get()); if(chat.getTextLine2() == null || chat.getTextLine2().length() == 0) { chat.setTextLine2("..."); } chat.setIcon(c.getLargeIcon()); chats.add(chat); chat.addActionListener(e -> new ChatForm(c, this).show()); } chats.revalidate(); }); } MainForm
  • 20. return fab.bindFabToContainer(cnt); } public void refreshChatsContainer() { Server.fetchChatList(contacts -> { chats.removeAll(); for(ChatContact c : contacts) { MultiButton chat = new MultiButton(c.name.get()); chat.setTextLine2(c.tagline.get()); if(chat.getTextLine2() == null || chat.getTextLine2().length() == 0) { chat.setTextLine2("..."); } chat.setIcon(c.getLargeIcon()); chats.add(chat); chat.addActionListener(e -> new ChatForm(c, this).show()); } chats.revalidate(); }); } MainForm
  • 21. chat.addActionListener(e -> new ChatForm(c, this).show()); } chats.revalidate(); }); } private Container createChatsContainer() { chats = new Container(BoxLayout.y()); chats.setScrollableY(true); refreshChatsContainer(); FloatingActionButton fab = FloatingActionButton. createFAB(FontImage.MATERIAL_CHAT); fab.addActionListener(e -> new NewMessageForm().show()); return fab.bindFabToContainer(chats); } private Container createCameraView() { if(ck != null) { MainForm
  • 22. chat.addActionListener(e -> new ChatForm(c, this).show()); } chats.revalidate(); }); } private Container createChatsContainer() { chats = new Container(BoxLayout.y()); chats.setScrollableY(true); refreshChatsContainer(); FloatingActionButton fab = FloatingActionButton. createFAB(FontImage.MATERIAL_CHAT); fab.addActionListener(e -> new NewMessageForm().show()); return fab.bindFabToContainer(chats); } private Container createCameraView() { if(ck != null) { MainForm
  • 23. chat.addActionListener(e -> new ChatForm(c, this).show()); } chats.revalidate(); }); } private Container createChatsContainer() { chats = new Container(BoxLayout.y()); chats.setScrollableY(true); refreshChatsContainer(); FloatingActionButton fab = FloatingActionButton. createFAB(FontImage.MATERIAL_CHAT); fab.addActionListener(e -> new NewMessageForm().show()); return fab.bindFabToContainer(chats); } private Container createCameraView() { if(ck != null) { MainForm
  • 24. } private Container createCameraView() { if(ck != null) { Container cameraCnt = new Container(new LayeredLayout()); tabs.addSelectionListener((oldSelected, newSelected) -> { if(newSelected == 0) { //ck.start(); //cameraCnt.add(ck.getView()); getToolbar().setHidden(true); } else { if(oldSelected == 0) { //cameraCnt.removeAll(); //ck.stop(); getToolbar().setHidden(false); } } }); return cameraCnt; } return BorderLayout.center(new Label("Camera Unsupported")); MainForm
  • 25. } return BorderLayout.center(new Label("Camera Unsupported")); } private void showOverflowMenu() { Button newGroup = new Button("New group", "Command"); Button newBroadcast = new Button("New broadcast", "Command"); Button whatsappWeb = new Button("WhatsApp Web", "Command"); Button starred = new Button("Starred Messages", "Command"); Button settings = new Button("Settings", "Command"); Container cnt = BoxLayout.encloseY(newGroup, newBroadcast, whatsappWeb, starred, settings); cnt.setUIID("CommandList"); Dialog dlg = new Dialog(new BorderLayout()); dlg.setDialogUIID("Container"); dlg.add(CENTER, cnt); dlg.setDisposeWhenPointerOutOfBounds(true); dlg.setTransitionInAnimator(CommonTransitions.createEmpty()); dlg.setTransitionOutAnimator(CommonTransitions.createEmpty()); dlg.setBackCommand("", null, e -> dlg.dispose()); int top = getUIManager().getComponentStyle("StatusBar"). getVerticalPadding(); setTintColor(0); MainForm
  • 26. } return BorderLayout.center(new Label("Camera Unsupported")); } private void showOverflowMenu() { Button newGroup = new Button("New group", "Command"); Button newBroadcast = new Button("New broadcast", "Command"); Button whatsappWeb = new Button("WhatsApp Web", "Command"); Button starred = new Button("Starred Messages", "Command"); Button settings = new Button("Settings", "Command"); Container cnt = BoxLayout.encloseY(newGroup, newBroadcast, whatsappWeb, starred, settings); cnt.setUIID("CommandList"); Dialog dlg = new Dialog(new BorderLayout()); dlg.setDialogUIID("Container"); dlg.add(CENTER, cnt); dlg.setDisposeWhenPointerOutOfBounds(true); dlg.setTransitionInAnimator(CommonTransitions.createEmpty()); dlg.setTransitionOutAnimator(CommonTransitions.createEmpty()); dlg.setBackCommand("", null, e -> dlg.dispose()); int top = getUIManager().getComponentStyle("StatusBar"). getVerticalPadding(); setTintColor(0); MainForm
  • 27. Button whatsappWeb = new Button("WhatsApp Web", "Command"); Button starred = new Button("Starred Messages", "Command"); Button settings = new Button("Settings", "Command"); Container cnt = BoxLayout.encloseY(newGroup, newBroadcast, whatsappWeb, starred, settings); cnt.setUIID("CommandList"); Dialog dlg = new Dialog(new BorderLayout()); dlg.setDialogUIID("Container"); dlg.add(CENTER, cnt); dlg.setDisposeWhenPointerOutOfBounds(true); dlg.setTransitionInAnimator(CommonTransitions.createEmpty()); dlg.setTransitionOutAnimator(CommonTransitions.createEmpty()); dlg.setBackCommand("", null, e -> dlg.dispose()); int top = getUIManager().getComponentStyle("StatusBar"). getVerticalPadding(); setTintColor(0); int bottom = getHeight() - cnt.getPreferredH() - top - cnt.getUnselectedStyle().getVerticalPadding() - cnt.getUnselectedStyle().getVerticalMargins(); int w = getWidth(); int left = w - cnt.getPreferredW() - cnt.getUnselectedStyle().getHorizontalPadding() - cnt.getUnselectedStyle().getHorizontalMargins(); MainForm
  • 28. Button whatsappWeb = new Button("WhatsApp Web", "Command"); Button starred = new Button("Starred Messages", "Command"); Button settings = new Button("Settings", "Command"); Container cnt = BoxLayout.encloseY(newGroup, newBroadcast, whatsappWeb, starred, settings); cnt.setUIID("CommandList"); Dialog dlg = new Dialog(new BorderLayout()); dlg.setDialogUIID("Container"); dlg.add(CENTER, cnt); dlg.setDisposeWhenPointerOutOfBounds(true); dlg.setTransitionInAnimator(CommonTransitions.createEmpty()); dlg.setTransitionOutAnimator(CommonTransitions.createEmpty()); dlg.setBackCommand("", null, e -> dlg.dispose()); int top = getUIManager().getComponentStyle("StatusBar"). getVerticalPadding(); setTintColor(0); int bottom = getHeight() - cnt.getPreferredH() - top - cnt.getUnselectedStyle().getVerticalPadding() - cnt.getUnselectedStyle().getVerticalMargins(); int w = getWidth(); int left = w - cnt.getPreferredW() - cnt.getUnselectedStyle().getHorizontalPadding() - cnt.getUnselectedStyle().getHorizontalMargins(); MainForm
  • 29. cnt.setUIID("CommandList"); Dialog dlg = new Dialog(new BorderLayout()); dlg.setDialogUIID("Container"); dlg.add(CENTER, cnt); dlg.setDisposeWhenPointerOutOfBounds(true); dlg.setTransitionInAnimator(CommonTransitions.createEmpty()); dlg.setTransitionOutAnimator(CommonTransitions.createEmpty()); dlg.setBackCommand("", null, e -> dlg.dispose()); int top = getUIManager().getComponentStyle("StatusBar"). getVerticalPadding(); setTintColor(0); int bottom = getHeight() - cnt.getPreferredH() - top - cnt.getUnselectedStyle().getVerticalPadding() - cnt.getUnselectedStyle().getVerticalMargins(); int w = getWidth(); int left = w - cnt.getPreferredW() - cnt.getUnselectedStyle().getHorizontalPadding() - cnt.getUnselectedStyle().getHorizontalMargins(); dlg.show(top, bottom, left, 0); } private Container createTitleComponent(Container... scrollables) { MainForm
  • 30. cnt.setUIID("CommandList"); Dialog dlg = new Dialog(new BorderLayout()); dlg.setDialogUIID("Container"); dlg.add(CENTER, cnt); dlg.setDisposeWhenPointerOutOfBounds(true); dlg.setTransitionInAnimator(CommonTransitions.createEmpty()); dlg.setTransitionOutAnimator(CommonTransitions.createEmpty()); dlg.setBackCommand("", null, e -> dlg.dispose()); int top = getUIManager().getComponentStyle("StatusBar"). getVerticalPadding(); setTintColor(0); int bottom = getHeight() - cnt.getPreferredH() - top - cnt.getUnselectedStyle().getVerticalPadding() - cnt.getUnselectedStyle().getVerticalMargins(); int w = getWidth(); int left = w - cnt.getPreferredW() - cnt.getUnselectedStyle().getHorizontalPadding() - cnt.getUnselectedStyle().getHorizontalMargins(); dlg.show(top, bottom, left, 0); } private Container createTitleComponent(Container... scrollables) { MainForm
  • 31. cnt.getUnselectedStyle().getVerticalMargins(); int w = getWidth(); int left = w - cnt.getPreferredW() - cnt.getUnselectedStyle().getHorizontalPadding() - cnt.getUnselectedStyle().getHorizontalMargins(); dlg.show(top, bottom, left, 0); } private Container createTitleComponent(Container... scrollables) { Label title = new Label("WhatsApp", "Title"); Container titleArea; if(title.getUnselectedStyle().getAlignment() == LEFT) { titleArea = BorderLayout.center(title); } else { // for iOS we want the title to center properly titleArea = BorderLayout.centerAbsolute(title); } Button search = new Button("", FontImage.MATERIAL_SEARCH, "Title"); Button overflow = new Button("", FontImage.MATERIAL_MORE_VERT, "Title"); overflow.addActionListener(e -> showOverflowMenu()); MainForm
  • 32. cnt.getUnselectedStyle().getVerticalMargins(); int w = getWidth(); int left = w - cnt.getPreferredW() - cnt.getUnselectedStyle().getHorizontalPadding() - cnt.getUnselectedStyle().getHorizontalMargins(); dlg.show(top, bottom, left, 0); } private Container createTitleComponent(Container... scrollables) { Label title = new Label("WhatsApp", "Title"); Container titleArea; if(title.getUnselectedStyle().getAlignment() == LEFT) { titleArea = BorderLayout.center(title); } else { // for iOS we want the title to center properly titleArea = BorderLayout.centerAbsolute(title); } Button search = new Button("", FontImage.MATERIAL_SEARCH, "Title"); Button overflow = new Button("", FontImage.MATERIAL_MORE_VERT, "Title"); overflow.addActionListener(e -> showOverflowMenu()); MainForm
  • 33. if(title.getUnselectedStyle().getAlignment() == LEFT) { titleArea = BorderLayout.center(title); } else { // for iOS we want the title to center properly titleArea = BorderLayout.centerAbsolute(title); } Button search = new Button("", FontImage.MATERIAL_SEARCH, "Title"); Button overflow = new Button("", FontImage.MATERIAL_MORE_VERT, "Title"); overflow.addActionListener(e -> showOverflowMenu()); titleArea.add(EAST, GridLayout.encloseIn(2, search, overflow)); ButtonGroup bg = new ButtonGroup(); RadioButton camera = RadioButton.createToggle("", bg); camera.setUIID("SubTitle"); FontImage.setMaterialIcon(camera, FontImage.MATERIAL_CAMERA_ALT); RadioButton chats = RadioButton.createToggle("Chats", bg); RadioButton status = RadioButton.createToggle("Status", bg); RadioButton calls = RadioButton.createToggle("Calls", bg); chats.setUIID("SubTitle"); status.setUIID("SubTitle"); calls.setUIID("SubTitle"); MainForm
  • 34. Button search = new Button("", FontImage.MATERIAL_SEARCH, "Title"); Button overflow = new Button("", FontImage.MATERIAL_MORE_VERT, "Title"); overflow.addActionListener(e -> showOverflowMenu()); titleArea.add(EAST, GridLayout.encloseIn(2, search, overflow)); ButtonGroup bg = new ButtonGroup(); RadioButton camera = RadioButton.createToggle("", bg); camera.setUIID("SubTitle"); FontImage.setMaterialIcon(camera, FontImage.MATERIAL_CAMERA_ALT); RadioButton chats = RadioButton.createToggle("Chats", bg); RadioButton status = RadioButton.createToggle("Status", bg); RadioButton calls = RadioButton.createToggle("Calls", bg); chats.setUIID("SubTitle"); status.setUIID("SubTitle"); calls.setUIID("SubTitle"); RadioButton[] buttons = new RadioButton[] { camera, chats, status, calls }; TableLayout tb = new TableLayout(2, 4); Container toggles = new Container(tb); MainForm
  • 35. status.setUIID("SubTitle"); calls.setUIID("SubTitle"); RadioButton[] buttons = new RadioButton[] { camera, chats, status, calls }; TableLayout tb = new TableLayout(2, 4); Container toggles = new Container(tb); toggles.add(tb.createConstraint().widthPercentage(10), camera); toggles.add(tb.createConstraint().widthPercentage(30), chats); toggles.add(tb.createConstraint().widthPercentage(30), status); toggles.add(tb.createConstraint().widthPercentage(30), calls); Label whiteLine = new Label("", "SubTitleUnderline"); whiteLine.setShowEvenIfBlank(true); toggles.add(tb.createConstraint(1, 1) ,whiteLine); final Container finalTitle = titleArea; for(int iter = 0 ; iter < buttons.length ; iter++) { final int current = iter; buttons[iter].addActionListener(e -> { MainForm
  • 36. TableLayout tb = new TableLayout(2, 4); Container toggles = new Container(tb); toggles.add(tb.createConstraint().widthPercentage(10), camera); toggles.add(tb.createConstraint().widthPercentage(30), chats); toggles.add(tb.createConstraint().widthPercentage(30), status); toggles.add(tb.createConstraint().widthPercentage(30), calls); Label whiteLine = new Label("", "SubTitleUnderline"); whiteLine.setShowEvenIfBlank(true); toggles.add(tb.createConstraint(1, 1) ,whiteLine); final Container finalTitle = titleArea; for(int iter = 0 ; iter < buttons.length ; iter++) { final int current = iter; buttons[iter].addActionListener(e -> { tabs.setSelectedIndex(current); whiteLine.remove(); toggles.add(tb.createConstraint(1, current) ,whiteLine); finalTitle.setPreferredSize(null); toggles.animateLayout(100); }); } MainForm
  • 37. Label whiteLine = new Label("", "SubTitleUnderline"); whiteLine.setShowEvenIfBlank(true); toggles.add(tb.createConstraint(1, 1) ,whiteLine); final Container finalTitle = titleArea; for(int iter = 0 ; iter < buttons.length ; iter++) { final int current = iter; buttons[iter].addActionListener(e -> { tabs.setSelectedIndex(current); whiteLine.remove(); toggles.add(tb.createConstraint(1, current) ,whiteLine); finalTitle.setPreferredSize(null); toggles.animateLayout(100); }); } tabs.addSelectionListener((oldSelected, newSelected) -> { if(!buttons[newSelected].isSelected()) { finalTitle.setPreferredSize(null); buttons[newSelected].setSelected(true); whiteLine.remove(); toggles.add(tb.createConstraint(1, newSelected) ,whiteLine); MainForm
  • 38. Label whiteLine = new Label("", "SubTitleUnderline"); whiteLine.setShowEvenIfBlank(true); toggles.add(tb.createConstraint(1, 1) ,whiteLine); final Container finalTitle = titleArea; for(int iter = 0 ; iter < buttons.length ; iter++) { final int current = iter; buttons[iter].addActionListener(e -> { tabs.setSelectedIndex(current); whiteLine.remove(); toggles.add(tb.createConstraint(1, current) ,whiteLine); finalTitle.setPreferredSize(null); toggles.animateLayout(100); }); } tabs.addSelectionListener((oldSelected, newSelected) -> { if(!buttons[newSelected].isSelected()) { finalTitle.setPreferredSize(null); buttons[newSelected].setSelected(true); whiteLine.remove(); toggles.add(tb.createConstraint(1, newSelected) ,whiteLine); MainForm
  • 39. Label whiteLine = new Label("", "SubTitleUnderline"); whiteLine.setShowEvenIfBlank(true); toggles.add(tb.createConstraint(1, 1) ,whiteLine); final Container finalTitle = titleArea; for(int iter = 0 ; iter < buttons.length ; iter++) { final int current = iter; buttons[iter].addActionListener(e -> { tabs.setSelectedIndex(current); whiteLine.remove(); toggles.add(tb.createConstraint(1, current) ,whiteLine); finalTitle.setPreferredSize(null); toggles.animateLayout(100); }); } tabs.addSelectionListener((oldSelected, newSelected) -> { if(!buttons[newSelected].isSelected()) { finalTitle.setPreferredSize(null); buttons[newSelected].setSelected(true); whiteLine.remove(); toggles.add(tb.createConstraint(1, newSelected) ,whiteLine); MainForm
  • 40. Label whiteLine = new Label("", "SubTitleUnderline"); whiteLine.setShowEvenIfBlank(true); toggles.add(tb.createConstraint(1, 1) ,whiteLine); final Container finalTitle = titleArea; for(int iter = 0 ; iter < buttons.length ; iter++) { final int current = iter; buttons[iter].addActionListener(e -> { tabs.setSelectedIndex(current); whiteLine.remove(); toggles.add(tb.createConstraint(1, current) ,whiteLine); finalTitle.setPreferredSize(null); toggles.animateLayout(100); }); } tabs.addSelectionListener((oldSelected, newSelected) -> { if(!buttons[newSelected].isSelected()) { finalTitle.setPreferredSize(null); buttons[newSelected].setSelected(true); whiteLine.remove(); toggles.add(tb.createConstraint(1, newSelected) ,whiteLine); MainForm
  • 41. Label whiteLine = new Label("", "SubTitleUnderline"); whiteLine.setShowEvenIfBlank(true); toggles.add(tb.createConstraint(1, 1) ,whiteLine); final Container finalTitle = titleArea; for(int iter = 0 ; iter < buttons.length ; iter++) { final int current = iter; buttons[iter].addActionListener(e -> { tabs.setSelectedIndex(current); whiteLine.remove(); toggles.add(tb.createConstraint(1, current) ,whiteLine); finalTitle.setPreferredSize(null); toggles.animateLayout(100); }); } tabs.addSelectionListener((oldSelected, newSelected) -> { if(!buttons[newSelected].isSelected()) { finalTitle.setPreferredSize(null); buttons[newSelected].setSelected(true); whiteLine.remove(); toggles.add(tb.createConstraint(1, newSelected) ,whiteLine); MainForm
  • 42. whiteLine.remove(); toggles.add(tb.createConstraint(1, current) ,whiteLine); finalTitle.setPreferredSize(null); toggles.animateLayout(100); }); } tabs.addSelectionListener((oldSelected, newSelected) -> { if(!buttons[newSelected].isSelected()) { finalTitle.setPreferredSize(null); buttons[newSelected].setSelected(true); whiteLine.remove(); toggles.add(tb.createConstraint(1, newSelected) ,whiteLine); toggles.animateLayout(100); } }); bindFolding(titleArea, titleArea.getPreferredH(), scrollables); return BoxLayout.encloseY(titleArea, toggles); } private void bindFolding(Container titleArea, int titleHeight, MainForm
  • 43. whiteLine.remove(); toggles.add(tb.createConstraint(1, current) ,whiteLine); finalTitle.setPreferredSize(null); toggles.animateLayout(100); }); } tabs.addSelectionListener((oldSelected, newSelected) -> { if(!buttons[newSelected].isSelected()) { finalTitle.setPreferredSize(null); buttons[newSelected].setSelected(true); whiteLine.remove(); toggles.add(tb.createConstraint(1, newSelected) ,whiteLine); toggles.animateLayout(100); } }); bindFolding(titleArea, titleArea.getPreferredH(), scrollables); return BoxLayout.encloseY(titleArea, toggles); } private void bindFolding(Container titleArea, int titleHeight, MainForm
  • 44. whiteLine.remove(); toggles.add(tb.createConstraint(1, current) ,whiteLine); finalTitle.setPreferredSize(null); toggles.animateLayout(100); }); } tabs.addSelectionListener((oldSelected, newSelected) -> { if(!buttons[newSelected].isSelected()) { finalTitle.setPreferredSize(null); buttons[newSelected].setSelected(true); whiteLine.remove(); toggles.add(tb.createConstraint(1, newSelected) ,whiteLine); toggles.animateLayout(100); } }); bindFolding(titleArea, titleArea.getPreferredH(), scrollables); return BoxLayout.encloseY(titleArea, toggles); } private void bindFolding(Container titleArea, int titleHeight, MainForm
  • 45. whiteLine.remove(); toggles.add(tb.createConstraint(1, current) ,whiteLine); finalTitle.setPreferredSize(null); toggles.animateLayout(100); }); } tabs.addSelectionListener((oldSelected, newSelected) -> { if(!buttons[newSelected].isSelected()) { finalTitle.setPreferredSize(null); buttons[newSelected].setSelected(true); whiteLine.remove(); toggles.add(tb.createConstraint(1, newSelected) ,whiteLine); toggles.animateLayout(100); } }); bindFolding(titleArea, titleArea.getPreferredH(), scrollables); return BoxLayout.encloseY(titleArea, toggles); } private void bindFolding(Container titleArea, int titleHeight, MainForm
  • 46. tabs.addSelectionListener((oldSelected, newSelected) -> { if(!buttons[newSelected].isSelected()) { finalTitle.setPreferredSize(null); buttons[newSelected].setSelected(true); whiteLine.remove(); toggles.add(tb.createConstraint(1, newSelected) ,whiteLine); toggles.animateLayout(100); } }); bindFolding(titleArea, titleArea.getPreferredH(), scrollables); return BoxLayout.encloseY(titleArea, toggles); } private void bindFolding(Container titleArea, int titleHeight, Container... scrollables) { addPointerReleasedListener(e -> { if(titleArea.getHeight() != titleHeight && titleArea.getHeight() != 0) { if(titleHeight - titleArea.getHeight() > titleHeight / 2) { MainForm
  • 47. tabs.addSelectionListener((oldSelected, newSelected) -> { if(!buttons[newSelected].isSelected()) { finalTitle.setPreferredSize(null); buttons[newSelected].setSelected(true); whiteLine.remove(); toggles.add(tb.createConstraint(1, newSelected) ,whiteLine); toggles.animateLayout(100); } }); bindFolding(titleArea, titleArea.getPreferredH(), scrollables); return BoxLayout.encloseY(titleArea, toggles); } private void bindFolding(Container titleArea, int titleHeight, Container... scrollables) { addPointerReleasedListener(e -> { if(titleArea.getHeight() != titleHeight && titleArea.getHeight() != 0) { if(titleHeight - titleArea.getHeight() > titleHeight / 2) { MainForm
  • 48. return BoxLayout.encloseY(titleArea, toggles); } private void bindFolding(Container titleArea, int titleHeight, Container... scrollables) { addPointerReleasedListener(e -> { if(titleArea.getHeight() != titleHeight && titleArea.getHeight() != 0) { if(titleHeight - titleArea.getHeight() > titleHeight / 2) { titleArea.setPreferredSize(null); } else { titleArea.setPreferredH(0); } titleArea.getParent().animateLayout(100); } }); for(Container c : scrollables) { c.addScrollListener((scrollX, scrollY, oldscrollX, oldscrollY) -> { // special case for tensile drag if(scrollY <= 10) { MainForm
  • 49. return BoxLayout.encloseY(titleArea, toggles); } private void bindFolding(Container titleArea, int titleHeight, Container... scrollables) { addPointerReleasedListener(e -> { if(titleArea.getHeight() != titleHeight && titleArea.getHeight() != 0) { if(titleHeight - titleArea.getHeight() > titleHeight / 2) { titleArea.setPreferredSize(null); } else { titleArea.setPreferredH(0); } titleArea.getParent().animateLayout(100); } }); for(Container c : scrollables) { c.addScrollListener((scrollX, scrollY, oldscrollX, oldscrollY) -> { // special case for tensile drag if(scrollY <= 10) { MainForm
  • 50. return BoxLayout.encloseY(titleArea, toggles); } private void bindFolding(Container titleArea, int titleHeight, Container... scrollables) { addPointerReleasedListener(e -> { if(titleArea.getHeight() != titleHeight && titleArea.getHeight() != 0) { if(titleHeight - titleArea.getHeight() > titleHeight / 2) { titleArea.setPreferredSize(null); } else { titleArea.setPreferredH(0); } titleArea.getParent().animateLayout(100); } }); for(Container c : scrollables) { c.addScrollListener((scrollX, scrollY, oldscrollX, oldscrollY) -> { // special case for tensile drag if(scrollY <= 10) { MainForm
  • 51. return BoxLayout.encloseY(titleArea, toggles); } private void bindFolding(Container titleArea, int titleHeight, Container... scrollables) { addPointerReleasedListener(e -> { if(titleArea.getHeight() != titleHeight && titleArea.getHeight() != 0) { if(titleHeight - titleArea.getHeight() > titleHeight / 2) { titleArea.setPreferredSize(null); } else { titleArea.setPreferredH(0); } titleArea.getParent().animateLayout(100); } }); for(Container c : scrollables) { c.addScrollListener((scrollX, scrollY, oldscrollX, oldscrollY) -> { // special case for tensile drag if(scrollY <= 10) { MainForm
  • 52. return BoxLayout.encloseY(titleArea, toggles); } private void bindFolding(Container titleArea, int titleHeight, Container... scrollables) { addPointerReleasedListener(e -> { if(titleArea.getHeight() != titleHeight && titleArea.getHeight() != 0) { if(titleHeight - titleArea.getHeight() > titleHeight / 2) { titleArea.setPreferredSize(null); } else { titleArea.setPreferredH(0); } titleArea.getParent().animateLayout(100); } }); for(Container c : scrollables) { c.addScrollListener((scrollX, scrollY, oldscrollX, oldscrollY) -> { // special case for tensile drag if(scrollY <= 10) { MainForm
  • 53. return BoxLayout.encloseY(titleArea, toggles); } private void bindFolding(Container titleArea, int titleHeight, Container... scrollables) { addPointerReleasedListener(e -> { if(titleArea.getHeight() != titleHeight && titleArea.getHeight() != 0) { if(titleHeight - titleArea.getHeight() > titleHeight / 2) { titleArea.setPreferredSize(null); } else { titleArea.setPreferredH(0); } titleArea.getParent().animateLayout(100); } }); for(Container c : scrollables) { c.addScrollListener((scrollX, scrollY, oldscrollX, oldscrollY) -> { // special case for tensile drag if(scrollY <= 10) { MainForm
  • 54. return BoxLayout.encloseY(titleArea, toggles); } private void bindFolding(Container titleArea, int titleHeight, Container... scrollables) { addPointerReleasedListener(e -> { if(titleArea.getHeight() != titleHeight && titleArea.getHeight() != 0) { if(titleHeight - titleArea.getHeight() > titleHeight / 2) { titleArea.setPreferredSize(null); } else { titleArea.setPreferredH(0); } titleArea.getParent().animateLayout(100); } }); for(Container c : scrollables) { c.addScrollListener((scrollX, scrollY, oldscrollX, oldscrollY) -> { // special case for tensile drag if(scrollY <= 10) { MainForm
  • 55. } titleArea.getParent().animateLayout(100); } }); for(Container c : scrollables) { c.addScrollListener((scrollX, scrollY, oldscrollX, oldscrollY) -> { // special case for tensile drag if(scrollY <= 10) { titleArea.setPreferredSize(null); return; } int diff = oldscrollY - scrollY; if(diff > 0) { if(titleArea.getHeight() < titleHeight) { titleArea.setPreferredH(Math.min(titleHeight, titleArea.getPreferredH() + diff)); titleArea.setHeight(titleArea.getPreferredH()); titleArea.getParent().revalidate(); } } else { if(diff < 0) { MainForm
  • 56. } titleArea.getParent().animateLayout(100); } }); for(Container c : scrollables) { c.addScrollListener((scrollX, scrollY, oldscrollX, oldscrollY) -> { // special case for tensile drag if(scrollY <= 10) { titleArea.setPreferredSize(null); return; } int diff = oldscrollY - scrollY; if(diff > 0) { if(titleArea.getHeight() < titleHeight) { titleArea.setPreferredH(Math.min(titleHeight, titleArea.getPreferredH() + diff)); titleArea.setHeight(titleArea.getPreferredH()); titleArea.getParent().revalidate(); } } else { if(diff < 0) { MainForm
  • 57. if(scrollY <= 10) { titleArea.setPreferredSize(null); return; } int diff = oldscrollY - scrollY; if(diff > 0) { if(titleArea.getHeight() < titleHeight) { titleArea.setPreferredH(Math.min(titleHeight, titleArea.getPreferredH() + diff)); titleArea.setHeight(titleArea.getPreferredH()); titleArea.getParent().revalidate(); } } else { if(diff < 0) { if(titleArea.getHeight() > 0) { titleArea.setPreferredH(Math.max(0, titleArea.getPreferredH() + diff)); titleArea.setHeight(titleArea.getPreferredH()); titleArea.getParent().revalidate(); } } } MainForm
  • 58. if(scrollY <= 10) { titleArea.setPreferredSize(null); return; } int diff = oldscrollY - scrollY; if(diff > 0) { if(titleArea.getHeight() < titleHeight) { titleArea.setPreferredH(Math.min(titleHeight, titleArea.getPreferredH() + diff)); titleArea.setHeight(titleArea.getPreferredH()); titleArea.getParent().revalidate(); } } else { if(diff < 0) { if(titleArea.getHeight() > 0) { titleArea.setPreferredH(Math.max(0, titleArea.getPreferredH() + diff)); titleArea.setHeight(titleArea.getPreferredH()); titleArea.getParent().revalidate(); } } } MainForm
  • 59. int diff = oldscrollY - scrollY; if(diff > 0) { if(titleArea.getHeight() < titleHeight) { titleArea.setPreferredH(Math.min(titleHeight, titleArea.getPreferredH() + diff)); titleArea.setHeight(titleArea.getPreferredH()); titleArea.getParent().revalidate(); } } else { if(diff < 0) { if(titleArea.getHeight() > 0) { titleArea.setPreferredH(Math.max(0, titleArea.getPreferredH() + diff)); titleArea.setHeight(titleArea.getPreferredH()); titleArea.getParent().revalidate(); } } } }); } } MainForm
  • 60. } else { if(diff < 0) { if(titleArea.getHeight() > 0) { titleArea.setPreferredH(Math.max(0, titleArea.getPreferredH() + diff)); titleArea.setHeight(titleArea.getPreferredH()); titleArea.getParent().revalidate(); } } } }); } } @Override protected void initGlobalToolbar() { Toolbar tb = new Toolbar(); tb.setTitleCentered(false); setToolbar(tb); } } MainForm